| From 392a17b10ec4320d3c0e96e2a23ebaad1123b989 Mon Sep 17 00:00:00 2001 |
| From: Corey Minyard <cminyard@mvista.com> |
| Date: Sat, 29 Jul 2017 21:14:55 -0500 |
| Subject: ipmi: fix unsigned long underflow |
| |
| From: Corey Minyard <cminyard@mvista.com> |
| |
| commit 392a17b10ec4320d3c0e96e2a23ebaad1123b989 upstream. |
| |
| When I set the timeout to a specific value such as 500ms, the timeout |
| event will not happen in time due to the overflow in function |
| check_msg_timeout: |
| ... |
| ent->timeout -= timeout_period; |
| if (ent->timeout > 0) |
| return; |
| ... |
| |
| The type of timeout_period is long, but ent->timeout is unsigned long. |
| This patch makes the type consistent. |
| |
| Reported-by: Weilong Chen <chenweilong@huawei.com> |
| Signed-off-by: Corey Minyard <cminyard@mvista.com> |
| Tested-by: Weilong Chen <chenweilong@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/char/ipmi/ipmi_msghandler.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/char/ipmi/ipmi_msghandler.c |
| +++ b/drivers/char/ipmi/ipmi_msghandler.c |
| @@ -4030,7 +4030,8 @@ smi_from_recv_msg(ipmi_smi_t intf, struc |
| } |
| |
| static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent, |
| - struct list_head *timeouts, long timeout_period, |
| + struct list_head *timeouts, |
| + unsigned long timeout_period, |
| int slot, unsigned long *flags, |
| unsigned int *waiting_msgs) |
| { |
| @@ -4043,8 +4044,8 @@ static void check_msg_timeout(ipmi_smi_t |
| if (!ent->inuse) |
| return; |
| |
| - ent->timeout -= timeout_period; |
| - if (ent->timeout > 0) { |
| + if (timeout_period < ent->timeout) { |
| + ent->timeout -= timeout_period; |
| (*waiting_msgs)++; |
| return; |
| } |
| @@ -4110,7 +4111,8 @@ static void check_msg_timeout(ipmi_smi_t |
| } |
| } |
| |
| -static unsigned int ipmi_timeout_handler(ipmi_smi_t intf, long timeout_period) |
| +static unsigned int ipmi_timeout_handler(ipmi_smi_t intf, |
| + unsigned long timeout_period) |
| { |
| struct list_head timeouts; |
| struct ipmi_recv_msg *msg, *msg2; |