trace: forbid use of %m in trace event format strings
The '%m' format instructs glibc's printf()/syslog() implementation to insert the contents of strerror(errno). Since this is a glibc extension it should generally be avoided in QEMU due to need for portability to a variety of platforms. Even though vfio is Linux-only code that could otherwise use "%m", it must still be avoided in trace-events files because several of the backends do not use the format string and so this error information is invisible to them. The errno string value should be given as an explicit trace argument instead, making it accessible to all backends. This also allows it to work correctly with future patches that use the format string with systemtap's simple printf code. Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> Message-id: 20190123120016.4538-4-berrange@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
7760636309
commit
772f1b3721
@ -2581,7 +2581,7 @@ static void vfio_populate_device(VFIOPCIDevice *vdev, Error **errp)
|
|||||||
ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
|
ret = ioctl(vdev->vbasedev.fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
/* This can fail for an old kernel or legacy PCI dev */
|
/* This can fail for an old kernel or legacy PCI dev */
|
||||||
trace_vfio_populate_device_get_irq_info_failure();
|
trace_vfio_populate_device_get_irq_info_failure(strerror(errno));
|
||||||
} else if (irq_info.count == 1) {
|
} else if (irq_info.count == 1) {
|
||||||
vdev->pci_aer = true;
|
vdev->pci_aer = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -37,7 +37,7 @@ vfio_pci_hot_reset_has_dep_devices(const char *name) "%s: hot reset dependent de
|
|||||||
vfio_pci_hot_reset_dep_devices(int domain, int bus, int slot, int function, int group_id) "\t%04x:%02x:%02x.%x group %d"
|
vfio_pci_hot_reset_dep_devices(int domain, int bus, int slot, int function, int group_id) "\t%04x:%02x:%02x.%x group %d"
|
||||||
vfio_pci_hot_reset_result(const char *name, const char *result) "%s hot reset: %s"
|
vfio_pci_hot_reset_result(const char *name, const char *result) "%s hot reset: %s"
|
||||||
vfio_populate_device_config(const char *name, unsigned long size, unsigned long offset, unsigned long flags) "Device %s config:\n size: 0x%lx, offset: 0x%lx, flags: 0x%lx"
|
vfio_populate_device_config(const char *name, unsigned long size, unsigned long offset, unsigned long flags) "Device %s config:\n size: 0x%lx, offset: 0x%lx, flags: 0x%lx"
|
||||||
vfio_populate_device_get_irq_info_failure(void) "VFIO_DEVICE_GET_IRQ_INFO failure: %m"
|
vfio_populate_device_get_irq_info_failure(const char *errstr) "VFIO_DEVICE_GET_IRQ_INFO failure: %s"
|
||||||
vfio_realize(const char *name, int group_id) " (%s) group %d"
|
vfio_realize(const char *name, int group_id) " (%s) group %d"
|
||||||
vfio_mdev(const char *name, bool is_mdev) " (%s) is_mdev %d"
|
vfio_mdev(const char *name, bool is_mdev) " (%s) is_mdev %d"
|
||||||
vfio_add_ext_cap_dropped(const char *name, uint16_t cap, uint16_t offset) "%s 0x%x@0x%x"
|
vfio_add_ext_cap_dropped(const char *name, uint16_t cap, uint16_t offset) "%s 0x%x@0x%x"
|
||||||
|
@ -274,6 +274,10 @@ class Event(object):
|
|||||||
props = groups["props"].split()
|
props = groups["props"].split()
|
||||||
fmt = groups["fmt"]
|
fmt = groups["fmt"]
|
||||||
fmt_trans = groups["fmt_trans"]
|
fmt_trans = groups["fmt_trans"]
|
||||||
|
if fmt.find("%m") != -1 or fmt_trans.find("%m") != -1:
|
||||||
|
raise ValueError("Event format '%m' is forbidden, pass the error "
|
||||||
|
"as an explicit trace argument")
|
||||||
|
|
||||||
if len(fmt_trans) > 0:
|
if len(fmt_trans) > 0:
|
||||||
fmt = [fmt_trans, fmt]
|
fmt = [fmt_trans, fmt]
|
||||||
args = Arguments.build(groups["args"])
|
args = Arguments.build(groups["args"])
|
||||||
|
Loading…
Reference in New Issue
Block a user