Skip to content

Commit

Permalink
hw/core: rebase sysbus_get_fw_dev_path() to g_strdup_printf()
Browse files Browse the repository at this point in the history
This is done mainly for improving readability, and in preparation for the
next patch, but Markus pointed out another bonus for the string being
returned:

"No arbitrary length limit. Before the patch, it's 39 characters, and the
code breaks catastrophically when qdev_fw_name() is longer: the second
snprintf() is called with its first argument pointing beyond path[], and
its second argument underflowing to a huge size."

Cc: [email protected]
Signed-off-by: Laszlo Ersek <[email protected]>
Tested-by: Marcel Apfelbaum <[email protected]>
Reviewed-by: Marcel Apfelbaum <[email protected]>
Reviewed-by: Markus Armbruster <[email protected]>
Reviewed-by: Michael S. Tsirkin <[email protected]>
Signed-off-by: Michael S. Tsirkin <[email protected]>
  • Loading branch information
lersek authored and mstsirkin committed Jun 19, 2015
1 parent 1717388 commit 5ba03e2
Showing 1 changed file with 6 additions and 10 deletions.
16 changes: 6 additions & 10 deletions hw/core/sysbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,19 +281,15 @@ static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent)
static char *sysbus_get_fw_dev_path(DeviceState *dev)
{
SysBusDevice *s = SYS_BUS_DEVICE(dev);
char path[40];
int off;

off = snprintf(path, sizeof(path), "%s", qdev_fw_name(dev));

if (s->num_mmio) {
snprintf(path + off, sizeof(path) - off, "@"TARGET_FMT_plx,
s->mmio[0].addr);
} else if (s->num_pio) {
snprintf(path + off, sizeof(path) - off, "@i%04x", s->pio[0]);
return g_strdup_printf("%s@" TARGET_FMT_plx, qdev_fw_name(dev),
s->mmio[0].addr);
}

return g_strdup(path);
if (s->num_pio) {
return g_strdup_printf("%s@i%04x", qdev_fw_name(dev), s->pio[0]);
}
return g_strdup(qdev_fw_name(dev));
}

void sysbus_add_io(SysBusDevice *dev, hwaddr addr,
Expand Down

0 comments on commit 5ba03e2

Please sign in to comment.