Pierre Sangouard wrote:

>Hi,
>
>I've encountered 2 small bugs in lanserv (OpenIPMI 1.4.21). Here is a patch
>fixing them.
>
>Regards,
>Pierre
>  
>
This patch should completely fix the get session info in lanserv.

Thanks,

-Corey
Index: include/OpenIPMI/lanserv.h
===================================================================
RCS file: /cvsroot/openipmi/OpenIPMI/include/OpenIPMI/lanserv.h,v
retrieving revision 1.9
diff -u -r1.9 lanserv.h
--- include/OpenIPMI/lanserv.h	1 Jan 2005 06:26:14 -0000	1.9
+++ include/OpenIPMI/lanserv.h	17 Nov 2005 19:08:42 -0000
@@ -116,7 +116,7 @@
 {
     unsigned int active : 1;
 
-    int           idx; /* My idx in the table. */
+    int           handle; /* My index in the table. */
 
     unsigned char   authtype;
     ipmi_authdata_t authdata;
Index: lanserv/lanserv_ipmi.c
===================================================================
RCS file: /cvsroot/openipmi/OpenIPMI/lanserv/lanserv_ipmi.c,v
retrieving revision 1.9
diff -u -r1.9 lanserv_ipmi.c
--- lanserv/lanserv_ipmi.c	3 Jan 2005 23:03:19 -0000	1.9
+++ lanserv/lanserv_ipmi.c	17 Nov 2005 19:07:11 -0000
@@ -166,7 +166,7 @@
 	for (; size > 0; size--, data++)
 		csum += *data;
 
-	return -csum;
+	return csum;
 }
 
 
@@ -325,13 +325,13 @@
 
     pos[0] = msg->rq_addr;
     pos[1] = (rsp->netfn << 2) | msg->rq_lun;
-    pos[2] = ipmb_checksum(pos, 2, 0);
+    pos[2] = - ipmb_checksum(pos, 2, 0);
     pos[3] = msg->rs_addr;
     pos[4] = (msg->rq_seq << 2) | msg->rs_lun;
     pos[5] = rsp->cmd;
 
     csum = ipmb_checksum(pos+3, 3, 0);
-    csum = ipmb_checksum(rsp->data, rsp->data_len, csum);
+    csum = - ipmb_checksum(rsp->data, rsp->data_len, csum);
 
     vec[0].iov_base = data;
 
@@ -724,7 +724,8 @@
 
     if (lan->sid_seq == 0)
 	lan->sid_seq++;
-    session->sid = (lan->sid_seq << (SESSION_BITS_REQ+1)) | (session->idx << 1);
+    session->sid = ((lan->sid_seq << (SESSION_BITS_REQ+1))
+		    | (session->handle << 1));
     lan->sid_seq++;
 
     data[0] = 0;
@@ -904,53 +905,57 @@
 
 	sid = ipmi_get_uint32(msg->data+1);
 	nses = sid_to_session(lan, sid);
-    } else {
-	if (idx == 0xfe) {
-	    if (msg->len < 2) {
-		return_err(lan, msg, session,
-			   IPMI_REQUEST_DATA_LENGTH_INVALID_CC);
-		return;
-	    }
+    } else if (idx == 0xfe) {
+	int handle;
 
-	    idx = msg->data[1];
-	} else if (idx == 0) {
-	    idx = session->idx;
-	} else {
-	    int i;
+	if (msg->len < 2) {
+	    return_err(lan, msg, session,
+		       IPMI_REQUEST_DATA_LENGTH_INVALID_CC);
+	    return;
+	}
+	
+	handle = msg->data[1];
+	if (handle >= MAX_SESSIONS) {
+	    return_err(lan, msg, session, IPMI_INVALID_DATA_FIELD_CC);
+	    return;
+	}
+	if (lan->sessions[handle].active)
+	    nses = &lan->sessions[handle];
+    } else if (idx == 0) {
+	nses = session;
+    } else {
+	int i;
 
-	    if (idx <= lan->active_sessions) {
-		for (i=0; i<=MAX_SESSIONS; i++) {
-		    if (lan->sessions[i].active) {
-			idx--;
-			if (idx == 0) {
-			    nses = &(lan->sessions[i]);
-			    break;
-			}
+	if (idx <= lan->active_sessions) {
+	    for (i=0; i<=MAX_SESSIONS; i++) {
+		if (lan->sessions[i].active) {
+		    idx--;
+		    if (idx == 0) {
+			nses = &lan->sessions[i];
+			break;
 		    }
 		}
 	    }
 	}
     }
 
+    data[0] = 0;
+    data[2] = MAX_SESSIONS;
+    data[3] = lan->active_sessions;
     if (nses) {
-	data[1] = session->idx;
-	data[4] = session->userid;
-	data[5] = session->priv;
+	data[1] = nses->handle;
+	data[4] = nses->userid;
+	data[5] = nses->priv;
+	data[6] = MAIN_CHANNEL;
+	return_rsp_data(lan, msg, session, data, 7);
     } else {
 	data[1] = 0;
-	data[4] = 0;
-	data[5] = 0;
+	return_rsp_data(lan, msg, session, data, 4);
     }
 
-    data[0] = 0;
-    data[2] = MAX_SESSIONS;
-    data[3] = lan->active_sessions;
-    data[6] = MAIN_CHANNEL;
-
     /* FIXME - We don't currently return the IP information, because
        it's hard to get.  Maybe later. */
 
-    return_rsp_data(lan, msg, session, data, 7);
 }
 
 static void
@@ -2431,7 +2436,7 @@
     }
 
     for (i=0; i<=MAX_SESSIONS; i++) {
-	lan->sessions[i].idx = i;
+	lan->sessions[i].handle = i;
     }
 
     lan->lanparm.num_destinations = 15;

Reply via email to