coreboot_table: Use precision when printing lb_gpio name

The lb_gpio coreboot table entries use name fields fixed to 16 bytes.
GCC will not allow creating a static initializer for such a field with a
string of more than 16 characters... but exactly 16 characters is fine,
meaning there's no room for the terminating NUL byte. The payloads (at
least depthcharge) can deal with this as well because they're checking
the size when looking at that table entry, but our printk("%16s") does
not and will happily walk over the end until somewhere else in memory we
finally find the next NUL byte.

We should probably try to avoid strings of exactly 16 characters in this
field anyway, just in case -- but since GCC doesn't warn about them they
can easily slip back in. So solve this bug by also adding a precision
field to the printk, which will make it stop overrunning the string.

Signed-off-by: Julius Werner <jwerner@chromium.org>
Change-Id: Ifd7beef00d828f9dc2faa4747eace6ac4ca41899
Reviewed-on: https://review.coreboot.org/c/coreboot/+/49496
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Julius Werner 2021-01-15 17:48:11 -08:00 committed by Patrick Georgi
parent caef68968c
commit e0f058ffa8
1 changed files with 1 additions and 1 deletions

View File

@ -165,7 +165,7 @@ static void lb_gpios(struct lb_header *header)
" NAME | PORT | POLARITY | VALUE\n", " NAME | PORT | POLARITY | VALUE\n",
gpios->count); gpios->count);
for (g = &gpios->gpios[0]; g < &gpios->gpios[gpios->count]; g++) { for (g = &gpios->gpios[0]; g < &gpios->gpios[gpios->count]; g++) {
printk(BIOS_INFO, "%16s | ", g->name); printk(BIOS_INFO, "%16.16s | ", g->name);
if (g->port == -1) if (g->port == -1)
printk(BIOS_INFO, " undefined | "); printk(BIOS_INFO, " undefined | ");
else else