Blob Blame History Raw
diff -up ipmitool-1.8.18/src/plugins/open/open.c.checking-received ipmitool-1.8.18/src/plugins/open/open.c
--- ipmitool-1.8.18/src/plugins/open/open.c.checking-received	2023-07-25 17:14:22.112985375 +0200
+++ ipmitool-1.8.18/src/plugins/open/open.c	2023-07-25 17:14:22.115985324 +0200
@@ -336,48 +336,61 @@ ipmi_openipmi_send_cmd(struct ipmi_intf
 	read_timeout.tv_sec = IPMI_OPENIPMI_READ_TIMEOUT;
 	read_timeout.tv_usec = 0;
 	do {
-		retval = select(intf->fd+1, &rset, NULL, NULL, &read_timeout);
-	} while (retval < 0 && errno == EINTR);
-	if (retval < 0) {
-	   lperror(LOG_ERR, "I/O Error");
-	   if (data != NULL) {
-	      free(data);
+		do {
+			retval = select(intf->fd + 1, &rset, NULL, NULL, &read_timeout);
+		} while (retval < 0 && errno == EINTR);
+		if (retval < 0) {
+			lperror(LOG_ERR, "I/O Error");
+			if (data != NULL) {
+				free(data);
 				data = NULL;
-		 }
-	   return NULL;
-	} else if (retval == 0) {
-		lprintf(LOG_ERR, "No data available");
-		if (data != NULL) {
-			free(data);
-			data = NULL;
-		}
-		return NULL;
-	}
-	if (FD_ISSET(intf->fd, &rset) == 0) {
-	   lprintf(LOG_ERR, "No data available");
-	   if (data != NULL) {
-	      free(data);
+			}
+			return NULL;
+		} else if (retval == 0) {
+			lprintf(LOG_ERR, "No data available");
+			if (data != NULL) {
+				free(data);
 				data = NULL;
+			}
+			return NULL;
 		 }
-	   return NULL;
-	}
-
-	recv.addr = (unsigned char *) &addr;
-	recv.addr_len = sizeof(addr);
-	recv.msg.data = rsp.data;
-	recv.msg.data_len = sizeof(rsp.data);
-
-	/* get data */
-	if (ioctl(intf->fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv) < 0) {
-	   lperror(LOG_ERR, "Error receiving message");
-	   if (errno != EMSGSIZE) {
+		if (FD_ISSET(intf->fd, &rset) == 0) {
+			lprintf(LOG_ERR, "No data available");
 	      if (data != NULL) {
 					free(data);
 					data = NULL;
 				}
 	      return NULL;
 	   }
-	}
+
+		recv.addr = (unsigned char *)&addr;
+		recv.addr_len = sizeof(addr);
+		recv.msg.data = rsp.data;
+		recv.msg.data_len = sizeof(rsp.data);
+
+		/* get data */
+		if (ioctl(intf->fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv) < 0) {
+			lperror(LOG_ERR, "Error receiving message");
+			if (errno != EMSGSIZE) {
+				if (data != NULL) {
+					free(data);
+					data = NULL;
+				}
+				return NULL;
+			}
+		}
+
+		/* If the message received wasn't expected, try to grab the
+		 * next message until it's out of messages.  -EAGAIN is
+		 * returned if the list empty, but basically if it returns a
+		 * message, check if it's alright.
+		 */
+		if (_req.msgid != recv.msgid) {
+			lprintf(LOG_NOTICE,
+			        "Received a response with unexpected ID %ld vs. %ld",
+			        recv.msgid, _req.msgid);
+		}
+	} while (_req.msgid != recv.msgid);
 
 	if (verbose > 4) {
 	   fprintf(stderr, "Got message:");