This patch fixes some incorrect returns using copy_to_user. It is for 2.4.25 + the previous patch. -- Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ ) Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Index: drivers/usb/hiddev.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.4/drivers/usb/hiddev.c,v retrieving revision 1.2 diff -u -r1.2 hiddev.c --- a/drivers/usb/hiddev.c 14 Apr 2004 09:30:15 -0000 1.2 +++ b/drivers/usb/hiddev.c 14 Apr 2004 10:14:29 -0000 @@ -432,7 +432,9 @@ dinfo.product = dev->descriptor.idProduct; dinfo.version = dev->descriptor.bcdDevice; dinfo.num_applications = hid->maxapplication; - return copy_to_user((void *) arg, &dinfo, sizeof(dinfo)); + if (copy_to_user((void *) arg, &dinfo, sizeof(dinfo))) + return -EFAULT; + return 0; case HIDIOCGFLAG: return put_user(list->flags, (int *) arg); @@ -521,7 +523,9 @@ rinfo.num_fields = report->maxfield; - return copy_to_user((void *) arg, &rinfo, sizeof(rinfo)); + if (copy_to_user((void *) arg, &rinfo, sizeof(rinfo))) + return -EFAULT; + return 0; case HIDIOCGFIELDINFO: if (copy_from_user(&finfo, (void *) arg, sizeof(finfo))) @@ -551,7 +555,9 @@ finfo.unit_exponent = field->unit_exponent; finfo.unit = field->unit; - return copy_to_user((void *) arg, &finfo, sizeof(finfo)); + if (copy_to_user((void *) arg, &finfo, sizeof(finfo))) + return -EFAULT; + return 0; case HIDIOCGUSAGE: case HIDIOCSUSAGE: @@ -601,7 +607,9 @@ return field->usage[uref.usage_index].collection_index; } - return copy_to_user((void *) arg, &uref, sizeof(uref)); + if (copy_to_user((void *) arg, &uref, sizeof(uref))) + return -EFAULT; + return 0; case HIDIOCGCOLLECTIONINFO: if (copy_from_user(&cinfo, (void *) arg, sizeof(cinfo))) @@ -614,7 +622,9 @@ cinfo.usage = hid->collection[cinfo.index].usage; cinfo.level = hid->collection[cinfo.index].level; - return copy_to_user((void *) arg, &cinfo, sizeof(cinfo)); + if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo))) + return -EFAULT; + return 0; default: