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;