]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ipmi: Fix sequence number handling
authorCorey Minyard <cminyard@mvista.com>
Mon, 14 Nov 2016 16:11:30 +0000 (10:11 -0600)
committerCorey Minyard <cminyard@mvista.com>
Fri, 25 Nov 2016 00:09:49 +0000 (18:09 -0600)
The IPMI message handler uses a message id that the lower-layer
preserved to track the sequence number of the message.  The macros
that handled these sequence numbers were somewhat broken as they
could result in sequence number truncation and they were not
doing an "and" of the proper number of bits.

I think this actually is not a problem, because the truncation
should be harmless and the improper "and" didn't hurt anything
because sequence number generation used the same improper "and"
and wouldn't generate a sequence number that would get
truncated wrong.  However, it should be fixed.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Corey Minyard <cminyard@mvista.com>
drivers/char/ipmi/ipmi_msghandler.c

index fcdd886819f5c85d88767d9d2042b8fef7a1d11f..be982d10d305cd4ecb951b5a2f0cd43693938a7b 100644 (file)
@@ -158,15 +158,16 @@ struct seq_table {
  * Store the information in a msgid (long) to allow us to find a
  * sequence table entry from the msgid.
  */
-#define STORE_SEQ_IN_MSGID(seq, seqid) (((seq&0xff)<<26) | (seqid&0x3ffffff))
+#define STORE_SEQ_IN_MSGID(seq, seqid) \
+       ((((seq) & 0x3f) << 26) | ((seqid) & 0x3ffffff))
 
 #define GET_SEQ_FROM_MSGID(msgid, seq, seqid) \
        do {                                                            \
-               seq = ((msgid >> 26) & 0x3f);                           \
-               seqid = (msgid & 0x3fffff);                             \
+               seq = (((msgid) >> 26) & 0x3f);                         \
+               seqid = ((msgid) & 0x3ffffff);                          \
        } while (0)
 
-#define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3fffff)
+#define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3ffffff)
 
 struct ipmi_channel {
        unsigned char medium;