From 48f5a5d62f77fa6e191a73dc048197ac3fdb2e72 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Tue, 19 Nov 2024 08:20:38 +0100 Subject: [PATCH] rasdaemon: check if sscanf() processed all arguments on dev_name Ensure that all arguments are parsed by sscanf() when dealing with dev_name. Signed-off-by: Mauro Carvalho Chehab --- ras-aer-handler.c | 25 +++++++++++++------------ unified-sel.c | 4 +++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ras-aer-handler.c b/ras-aer-handler.c index 30b4d75..5d069f3 100644 --- a/ras-aer-handler.c +++ b/ras-aer-handler.c @@ -187,18 +187,19 @@ int ras_aer_event_handler(struct trace_seq *s, * number, byte 16[7:3] is device number, byte 16[2:0] is * function number */ - sscanf(ev.dev_name, "%x:%x:%x.%x", &seg, &bus, &dev, &fn); - - sel_data[1] = seg & 0xff; - sel_data[2] = (seg & 0xff00) >> 8; - sel_data[3] = bus; - sel_data[4] = (((dev & 0x1f) << 3) | (fn & 0x7)); - - snprintf(ipmi_add_sel, sizeof(ipmi_add_sel), - "ipmitool raw 0x0a 0x44 0x00 0x00 0xc0 0x00 0x00 0x00 0x00 0x3a 0xcd 0x00 0xc0 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", - sel_data[0], sel_data[1], sel_data[2], sel_data[3], sel_data[4]); - - rc = system(ipmi_add_sel); + rc = sscanf(ev.dev_name, "%x:%x:%x.%x", &seg, &bus, &dev, &fn); + if (rc == 4) { + sel_data[1] = seg & 0xff; + sel_data[2] = (seg & 0xff00) >> 8; + sel_data[3] = bus; + sel_data[4] = (((dev & 0x1f) << 3) | (fn & 0x7)); + + snprintf(ipmi_add_sel, sizeof(ipmi_add_sel), + "ipmitool raw 0x0a 0x44 0x00 0x00 0xc0 0x00 0x00 0x00 0x00 0x3a 0xcd 0x00 0xc0 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", + sel_data[0], sel_data[1], sel_data[2], sel_data[3], sel_data[4]); + + rc = system(ipmi_add_sel); + } if (rc) log(SYSLOG, LOG_WARNING, "Failed to execute ipmitool\n"); #endif diff --git a/unified-sel.c b/unified-sel.c index d0a94b1..78578d6 100644 --- a/unified-sel.c +++ b/unified-sel.c @@ -73,7 +73,9 @@ int openbmc_unified_sel_log(uint64_t severity, const char *dev_name, uint64_t st { int bus, dev, dev_fn, fn; - sscanf(dev_name, "%*x:%x:%x.%x", &bus, &dev, &fn); + if (sscanf(dev_name, "%*x:%x:%x.%x", &bus, &dev, &fn) != 3) + return -1; + dev_fn = (((dev & 0x1f) << 3) | (fn & 0x7)); /* -- 2.49.0