summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Levon <john.levon@joyent.com>2020-05-26 16:03:39 +0100
committerGitHub <noreply@github.com>2020-05-26 18:03:39 +0300
commitdfe17311d6bbf76d43bdc82dee2d579ac20f0645 (patch)
tree0ad467bdb51b7277cf71b4ac62e78626b8a5df1f
parentb97a110721646e5a2a2a3f01837c5cdb4e9a6cc3 (diff)
downloadipmitool-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.c15
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;