From f5fe7f061073dcc9e0166e1bb8c4f51998e31b64 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Wed, 3 Sep 2003 11:13:39 -0700 Subject: [PATCH] [PATCH] i8042 free_irq() aliasing fix The same address `i8042_request_irq_cookie' is used in three places for the i8042 request_irq() argument. This means that if someone calls i8042_check_mux() or i8042_check_aux() while the IRQ is in use, the free_irq() call in there will free the wrong IRQ handler. So give all three instances of request_irq() in i8042.c a distinct address by which to identify the IRQ instance. (This is probably a non-bug, because the `check' functions are not called when the device is open, but it is better this way). --- drivers/input/serio/i8042.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 8ba89df109fa0..c7e6774242c34 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c @@ -582,6 +582,7 @@ void i8042_controller_cleanup(void) static int __init i8042_check_mux(struct i8042_values *values) { unsigned char param; + static int i8042_check_mux_cookie; int i; /* @@ -589,9 +590,9 @@ static int __init i8042_check_mux(struct i8042_values *values) */ if (request_irq(values->irq, i8042_interrupt, SA_SHIRQ, - "i8042", i8042_request_irq_cookie)) + "i8042", &i8042_check_mux_cookie)) return -1; - free_irq(values->irq, i8042_request_irq_cookie); + free_irq(values->irq, &i8042_check_mux_cookie); /* * Get rid of bytes in the queue. @@ -654,6 +655,7 @@ static int __init i8042_check_mux(struct i8042_values *values) static int __init i8042_check_aux(struct i8042_values *values) { unsigned char param; + static int i8042_check_aux_cookie; /* * Check if AUX irq is available. If it isn't, then there is no point @@ -661,9 +663,9 @@ static int __init i8042_check_aux(struct i8042_values *values) */ if (request_irq(values->irq, i8042_interrupt, SA_SHIRQ, - "i8042", i8042_request_irq_cookie)) + "i8042", &i8042_check_aux_cookie)) return -1; - free_irq(values->irq, i8042_request_irq_cookie); + free_irq(values->irq, &i8042_check_aux_cookie); /* * Get rid of bytes in the queue. -- 2.53.0