diff options
author | John Levon <john.levon@joyent.com> | 2020-05-26 16:03:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-26 18:03:39 +0300 |
commit | dfe17311d6bbf76d43bdc82dee2d579ac20f0645 (patch) | |
tree | 0ad467bdb51b7277cf71b4ac62e78626b8a5df1f | |
parent | b97a110721646e5a2a2a3f01837c5cdb4e9a6cc3 (diff) | |
download | ipmitool-dfe17311d6bbf76d43bdc82dee2d579ac20f0645.tar.gz |
sdr: harden against bad records
Harden ipmi_sdr_get_record() against bad records
Signed-off-by: John Levon <john.levon@joyent.com>
-rw-r--r-- | lib/ipmi_sdr.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/lib/ipmi_sdr.c b/lib/ipmi_sdr.c index 07256cb..942ad97 100644 --- a/lib/ipmi_sdr.c +++ b/lib/ipmi_sdr.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2012 Hewlett-Packard Development Company, L.P. + * Copyright 2020 Joyent, Inc. * * Based on code from * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. @@ -3159,7 +3160,8 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, sdr_rq.length, sdr_rq.offset); rsp = intf->sendrecv(intf, &req); - if (!rsp) { + + if (!rsp || rsp->ccode == IPMI_CC_CANT_RET_NUM_REQ_BYTES) { sdr_max_read_len = sdr_rq.length - 1; if (sdr_max_read_len > 0) { /* no response may happen if requests are bridged @@ -3170,14 +3172,7 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, data = NULL; return NULL; } - } - - switch (rsp->ccode) { - case 0xca: - /* read too many bytes at once */ - sdr_max_read_len = sdr_rq.length - 1; - continue; - case 0xc5: + } else if (rsp->ccode == IPMI_CC_RES_CANCELED) { /* lost reservation */ lprintf(LOG_DEBUG, "SDR reservation cancelled. " "Sleeping a bit and retrying..."); @@ -3202,7 +3197,7 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, } memcpy(data + i, rsp->data + 2, sdr_rq.length); - i += sdr_max_read_len; + i += sdr_rq.length; } return data; |