V4L/DVB (12369): stv680: kfree called before usb_kill_urb
authorOliver Neukum <oliver@neukum.org>
Tue, 28 Jul 2009 14:52:10 +0000 (11:52 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 12 Sep 2009 15:18:28 +0000 (12:18 -0300)
The irq handler will touch memory. Even in the error case some URBs may
complete. Thus no memory must be kfreed before all URBs are killed.

Signed-off-by: Oliver Neukum <oliver@neukum.org>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Douglas Schilling Landgraf <dougsland@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/stv680.c

index 8b4e7dafce7b9d155c254a802282daa0f25f1570..6a91714125d27dd2fc054a9f953656f24a9cc4ab 100644 (file)
@@ -734,10 +734,6 @@ static int stv680_start_stream (struct usb_stv *stv680)
        return 0;
 
  nomem_err:
-       for (i = 0; i < STV680_NUMSCRATCH; i++) {
-               kfree(stv680->scratch[i].data);
-               stv680->scratch[i].data = NULL;
-       }
        for (i = 0; i < STV680_NUMSBUF; i++) {
                usb_kill_urb(stv680->urb[i]);
                usb_free_urb(stv680->urb[i]);
@@ -745,6 +741,11 @@ static int stv680_start_stream (struct usb_stv *stv680)
                kfree(stv680->sbuf[i].data);
                stv680->sbuf[i].data = NULL;
        }
+       /* used in irq, free only as all URBs are dead */
+       for (i = 0; i < STV680_NUMSCRATCH; i++) {
+               kfree(stv680->scratch[i].data);
+               stv680->scratch[i].data = NULL;
+       }
        return -ENOMEM;
 
 }