]> git.hungrycats.org Git - linux/commitdiff
[PATCH] i8042 free_irq() aliasing fix
authorAndrew Morton <akpm@osdl.org>
Wed, 3 Sep 2003 18:13:39 +0000 (11:13 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Wed, 3 Sep 2003 18:13:39 +0000 (11:13 -0700)
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

index 8ba89df109fa069482cc498bb37cb754f9322cda..c7e6774242c34077410b8a982e5928b95bd85e85 100644 (file)
@@ -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.