Messages in this thread Patch in this message | | | From | Robert Richter <> | Subject | [PATCH v2 01/10] EDAC/mc: Fix usage of snprintf() and dimm location setup | Date | Wed, 22 Apr 2020 13:58:05 +0200 |
| |
The setup of the dimm->location may be incomplete in case writing to dimm->label fails due to small buffer size. Fix this by iterating through all existing layers.
Also, the return value of snprintf() can be higher than the number of bytes written to the buffer in case it is to small. Fix usage of snprintf() by either porting it to scnprintf() or fixing the handling of the return code.
It is very unlikely the buffer is too small in practice, but fixing it anyway.
Signed-off-by: Robert Richter <rrichter@marvell.com> --- drivers/edac/edac_mc.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index 75ede27bdf6a..107d7c4de933 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c @@ -130,11 +130,11 @@ unsigned int edac_dimm_info_location(struct dimm_info *dimm, char *buf, n = snprintf(p, len, "%s %d ", edac_layer_name[mci->layers[i].type], dimm->location[i]); + if (len <= n) + return count + len - 1; p += n; len -= n; count += n; - if (!len) - break; } return count; @@ -397,19 +397,19 @@ static int edac_mc_alloc_dimms(struct mem_ctl_info *mci) */ len = sizeof(dimm->label); p = dimm->label; - n = snprintf(p, len, "mc#%u", mci->mc_idx); + n = scnprintf(p, len, "mc#%u", mci->mc_idx); p += n; len -= n; + for (layer = 0; layer < mci->n_layers; layer++) { - n = snprintf(p, len, "%s#%u", - edac_layer_name[mci->layers[layer].type], - pos[layer]); + dimm->location[layer] = pos[layer]; + if (len <= 1) + continue; + n = scnprintf(p, len, "%s#%u", + edac_layer_name[mci->layers[layer].type], + pos[layer]); p += n; len -= n; - dimm->location[layer] = pos[layer]; - - if (len <= 0) - break; } /* Link it to the csrows old API data */ -- 2.20.1
| |