Skip to contentSkip to conversation

edac: sb_edac: add sanity check to silence static checker

PATCH In review Dan Carpenter 3 participants 4 messages Nov 1, 2011

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 edac: sb_edac: add sanity check to silence static checker

I assume the the check on if (limit <= prv) prevents n_tads from actually reaching MAX_TAD. The problem with that is that it relies on the hardware returning the right value and Smatch complains that if it doesn't we could have a buffer overflow.

---
Feel free to ignore this patch if you want. I don't have very stong feelings about this either way.

drivers/edac/sb_edac.c +6 -0
index 7a402bf..ebf386c 100644
@@ -970,6 +970,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
 			break;
 		prv = limit;
 	}
+	if (n_tads = MAX_TAD) {
+		sprintf(msg, "Could not discover the memory channel");
+		edac_mc_handle_ce_no_info(mci, msg);
+		return -EINVAL;
+	}
+
 	ch_way = TAD_CH(reg) + 1;
 	sck_way = TAD_SOCK(reg) + 1;
 	/*
#1 lore raw

Am 01.11.2011 07:28, schrieb Dan Carpenter:

Quoted 15 lines

I assume the the check on if (limit <= prv) prevents n_tads from actually reaching MAX_TAD. The problem with that is that it relies on the hardware returning the right value and Smatch complains that if it doesn't we could have a buffer overflow.

---
Feel free to ignore this patch if you want. I don't have very stong feelings about this either way.

drivers/edac/sb_edac.c +0 -0
index 7a402bf..ebf386c 100644

drivers/edac/sb_edac.c static int get_memory_error_data(struct mem_ctl_info *mci, · line 974

Quoted 5 lines
drivers/edac/sb_edac.c +2 -0
@@ -970,6 +970,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
 			break;
 		prv = limit;
 	}
+	if (n_tads = MAX_TAD) {
+		sprintf(msg, "Could not discover the memory channel");

why the sprintf() ? can you not simply:

	edac_mc_handle_ce_no_info(mci,"Could not discover the memory channel");
		
	re,

wh

Quoted 7 lines
drivers/edac/sb_edac.c +4 -0
+		edac_mc_handle_ce_no_info(mci, msg);
+		return -EINVAL;
+	}
+
 	ch_way = TAD_CH(reg) + 1;
 	sck_way = TAD_SOCK(reg) + 1;
 	/*
#2 lore raw

Em 01-11-2011 10:32, walter harms escreveu:

Quoted 25 lines

Am 01.11.2011 07:28, schrieb Dan Carpenter:

Quoted 15 lines

I assume the the check on if (limit <= prv) prevents n_tads from actually reaching MAX_TAD. The problem with that is that it relies on the hardware returning the right value and Smatch complains that if it doesn't we could have a buffer overflow.

---
Feel free to ignore this patch if you want. I don't have very stong feelings about this either way.

drivers/edac/sb_edac.c +0 -0
index 7a402bf..ebf386c 100644

drivers/edac/sb_edac.c static int get_memory_error_data(struct mem_ctl_info *mci, · line 974

Quoted 5 lines
drivers/edac/sb_edac.c +2 -0
@@ -970,6 +970,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
 			break;
 		prv = limit;
 	}
+	if (n_tads = MAX_TAD) {
+		sprintf(msg, "Could not discover the memory channel");

why the sprintf() ? can you not simply:

Quoted 1 line
	edac_mc_handle_ce_no_info(mci,"Could not discover the memory channel");

Yes, please us the edac-specific call. I'm working on some patches that will provide an additional functionality to those edac report calls. So, using sprintf() won't do the right thing after applying those patches (likely for Kernel v3.3).

Quoted 10 lines
		
	re,

wh

Quoted 7 lines
drivers/edac/sb_edac.c +4 -0
+		edac_mc_handle_ce_no_info(mci, msg);
+		return -EINVAL;
+	}
+
 	ch_way = TAD_CH(reg) + 1;
 	sck_way = TAD_SOCK(reg) + 1;
 	/*
#3 lore raw
Quoted 12 lines · Mauro Carvalho Chehab
Quoted 11 lines

drivers/edac/sb_edac.c static int get_memory_error_data(struct mem_ctl_info *mci, · line 974

Quoted 8 lines
drivers/edac/sb_edac.c +2 -0
@@ -970,6 +970,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci,
 			break;
 		prv = limit;
 	}
+	if (n_tads == MAX_TAD) {
+		sprintf(msg, "Could not discover the memory channel");

why the sprintf() ? can you not simply:

	edac_mc_handle_ce_no_info(mci,"Could not discover the memory channel");
Quoted 5 lines

Yes, please us the edac-specific call. I'm working on some patches that will provide an additional functionality to those edac report calls. So, using sprintf() won't do the right thing after applying those patches (likely for Kernel v3.3).

I did use the edac-specific call. Walter is saying that the
sprintf() is not needed because I could just pass the string
directly. That's true enough, but I'd prefer to leave it how I wrote it so it matches everything else in this file. Also passing it directly as edac_mc_handle_ce_no_info(mci,"Could not discover the memory channel"); makes the line too long for the 80 character limit so someone will complain if I do that. This isn't a fast path so the sprintf() doesn't hurt anything.

Also looking at it now, I suspect this patch might be a bug fix instead of just to silence the warning. We have a similar check for the MAX_SAD loop earlier to the check that I added here for MAX_TAD.

regards,
dan carpenter