USB: cxacru: check data length is not negative
authorSimon Arlott <simon@fire.lp0.eu>
Sat, 21 Nov 2009 15:07:14 +0000 (15:07 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 2 Mar 2010 22:52:58 +0000 (14:52 -0800)
When attempting to read data that is not actually
an array of values, the length may be negative
which causes an Oops due to a likely access off
the end of the data array.

This bug should not occur under normal use unless
the device returns an invalid response.

Signed-off-by: Simon Arlott <simon@fire.lp0.eu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/atm/cxacru.c

index 4a26a6c93bec20d1ac69ba0e601c69c0d9969915..8da4a06bf1406455d0f8314782c5de620e94e41f 100644 (file)
@@ -596,7 +596,7 @@ static int cxacru_cm_get_array(struct cxacru_data *instance, enum cxacru_cm_requ
        len = ret / 4;
        for (offb = 0; offb < len; ) {
                int l = le32_to_cpu(buf[offb++]);
-               if (l > stride || l > (len - offb) / 2) {
+               if (l < 0 || l > stride || l > (len - offb) / 2) {
                        if (printk_ratelimit())
                                usb_err(instance->usbatm, "invalid data length from cm %#x: %d\n",
                                        cm, l);