From e320e266b181e6e981191283bd8c655d94df5e24 Mon Sep 17 00:00:00 2001 From: Zdenek Styblik Date: Thu, 14 Mar 2013 05:29:50 +0000 Subject: [PATCH] ID: 3576212 - 'lib/ipmi_event.c' - better rsp handling Commit changes handling of response in ipmi_event_fromsensor(). If ccode doesn't equal to 0, then error message is printed and function returns. Reported-by: Duncan Idaho --- ipmitool/lib/ipmi_event.c | 64 +++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/ipmitool/lib/ipmi_event.c b/ipmitool/lib/ipmi_event.c index dd93079..2f1032e 100644 --- a/ipmitool/lib/ipmi_event.c +++ b/ipmitool/lib/ipmi_event.c @@ -346,36 +346,42 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e rsp = ipmi_sdr_get_sensor_thresholds(intf, emsg.sensor_num, target, lun, channel); - - if (rsp != NULL && rsp->ccode == 0) { - - /* threshold reading */ - emsg.event_data[2] = rsp->data[(emsg.event_data[0] / 2) + 1]; - - rsp = ipmi_sdr_get_sensor_hysteresis(intf, emsg.sensor_num, - target, lun, channel); - if (rsp != NULL && rsp->ccode == 0) - off = dir ? rsp->data[0] : rsp->data[1]; - if (off <= 0) - off = 1; - - /* trigger reading */ - if (dir) { - if ((emsg.event_data[2] + off) > 0xff) - emsg.event_data[1] = 0xff; - else - emsg.event_data[1] = emsg.event_data[2] + off; - } - else { - if ((emsg.event_data[2] - off) < 0) - emsg.event_data[1] = 0; - else - emsg.event_data[1] = emsg.event_data[2] - off; - } - - /* trigger in byte 2, threshold in byte 3 */ - emsg.event_data[0] |= 0x50; + if (rsp == NULL) { + lprintf(LOG_ERR, + "Command Get Sensor Thresholds failed: invalid response."); + return (-1); + } else if (rsp->ccode != 0) { + lprintf(LOG_ERR, "Command Get Sensor Thresholds failed: %s", + val2str(rsp->ccode, completion_code_vals)); + return (-1); } + + /* threshold reading */ + emsg.event_data[2] = rsp->data[(emsg.event_data[0] / 2) + 1]; + + rsp = ipmi_sdr_get_sensor_hysteresis(intf, emsg.sensor_num, + target, lun, channel); + if (rsp != NULL && rsp->ccode == 0) + off = dir ? rsp->data[0] : rsp->data[1]; + if (off <= 0) + off = 1; + + /* trigger reading */ + if (dir) { + if ((emsg.event_data[2] + off) > 0xff) + emsg.event_data[1] = 0xff; + else + emsg.event_data[1] = emsg.event_data[2] + off; + } + else { + if ((emsg.event_data[2] - off) < 0) + emsg.event_data[1] = 0; + else + emsg.event_data[1] = emsg.event_data[2] - off; + } + + /* trigger in byte 2, threshold in byte 3 */ + emsg.event_data[0] |= 0x50; } break;