Thanks, I've applied it.

I also increased the size of the msg map to 32 bits with the attached patch.

-corey

On 06/13/2013 03:10 AM, Nikita Yushchenko wrote:
Hi.

I was running OpenIPMI against not-properly-behaving BMC, and discovered a
problem in incoming packet sequence number checking.

Attached patch should fix it.

Nikita

diff --git a/lib/ipmi_lan.c b/lib/ipmi_lan.c
index c138b9e..422b96a 100644
--- a/lib/ipmi_lan.c
+++ b/lib/ipmi_lan.c
@@ -260,12 +260,12 @@ typedef struct lan_ip_data_s
     uint32_t                   session_id;
     uint32_t                   outbound_seq_num;
     uint32_t                   inbound_seq_num;
-    uint16_t                   recv_msg_map;
+    uint32_t                   recv_msg_map;
 
     /* RMCP+ specific info */
     uint32_t                   unauth_out_seq_num;
     uint32_t                   unauth_in_seq_num;
-    uint16_t                   unauth_recv_msg_map;
+    uint32_t                   unauth_recv_msg_map;
     unsigned char              working_integ;
     unsigned char              working_conf;
     uint32_t                   mgsys_session_id;
@@ -2850,7 +2850,7 @@ check_command_queue(ipmi_con_t *ipmi, lan_data_t *lan)
    ranges, so adjust for this. */
 static int
 check_session_seq_num(lan_data_t *lan, uint32_t seq,
-		      uint32_t *in_seq, uint16_t *map,
+		      uint32_t *in_seq, uint32_t *map,
 		      int gt_allowed, int lt_allowed)
 {
     /* Check the sequence number. */
@@ -2862,7 +2862,7 @@ check_session_seq_num(lan_data_t *lan, uint32_t seq,
 	*in_seq = seq;
     } else if ((int) (*in_seq - seq) >= 0 && (int) (*in_seq - seq) <= lt_allowed) {
 	/* It's before the current sequence number, but within lt_allowed. */
-	uint16_t bit = 1 << (*in_seq - seq);
+	uint32_t bit = 1 << (*in_seq - seq);
 	if (*map & bit) {
 	    /* We've already received the message, so discard it. */
 	    add_stat(lan->ipmi, STAT_DUPLICATES, 1);
@@ -2888,14 +2888,14 @@ check_session_seq_num(lan_data_t *lan, uint32_t seq,
 
 static int
 check_15_session_seq_num(lan_data_t *lan, uint32_t seq,
-			 uint32_t *in_seq, uint16_t *map)
+			 uint32_t *in_seq, uint32_t *map)
 {
     return check_session_seq_num(lan, seq, in_seq, map, 8, 8);
 }
 
 static int
 check_20_session_seq_num(lan_data_t *lan, uint32_t seq,
-			 uint32_t *in_seq, uint16_t *map)
+			 uint32_t *in_seq, uint32_t *map)
 {
     return check_session_seq_num(lan, seq, in_seq, map, 15, 16);
 }
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to