On Wed, 21 Apr 2021 at 21:46, Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> wrote: > > snprintf() should be given the full buffer size, not one less. And it > guarantees nul-termination, so doing it manually afterwards is > pointless. > > It's even potentially harmful (though probably not in practice because > CPER_REC_LEN is 256), due to the "return how much would have been > written had the buffer been big enough" semantics. I.e., if the bank > and/or device strings are long enough that the "DIMM location ..." > output gets truncated, writing to msg[n] is a buffer overflow. > > Signed-off-by: Rasmus Villemoes <linux@xxxxxxxxxxxxxxxxxx> > --- > drivers/firmware/efi/cper.c | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-) > > diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c > index e15d484b6a5a..ea7ca74fc173 100644 > --- a/drivers/firmware/efi/cper.c > +++ b/drivers/firmware/efi/cper.c > @@ -276,8 +276,7 @@ static int cper_dimm_err_location(struct cper_mem_err_compact *mem, char *msg) > if (!msg || !(mem->validation_bits & CPER_MEM_VALID_MODULE_HANDLE)) > return 0; > > - n = 0; > - len = CPER_REC_LEN - 1; > + len = CPER_REC_LEN; > dmi_memdev_name(mem->mem_dev_handle, &bank, &device); > if (bank && device) > n = snprintf(msg, len, "DIMM location: %s %s ", bank, device); > @@ -286,7 +285,6 @@ static int cper_dimm_err_location(struct cper_mem_err_compact *mem, char *msg) > "DIMM location: not present. DMI handle: 0x%.4x ", > mem->mem_dev_handle); > > - msg[n] = '\0'; > return n; > } > > -- > 2.29.2 > Thanks, I will queue this up.