Hi!

This should help prevent some oopses. [It is good chance that upper
layer will correctly recover from our error.]

                                                                Pavel

--- clean/drivers/usb/usb.c     Sat Mar 25 22:47:36 2000
+++ linux/drivers/usb/usb.c     Mon Mar 27 23:55:44 2000
@@ -27,6 +27,8 @@
 #define DEBUG
 #include <linux/usb.h>
 
+#define CHECK do { if ((!dev) || (pipe == -1)) { printk( KERN_CRIT "Someone passed 
+NULL into usb core.\n" ); return -EINVAL; } } while(0)
+
 /*
  * Prototypes for the device driver probing/loading functions
  */
@@ -596,18 +598,20 @@
 
 /*-------------------------------------------------------------------*/
 // returns status (negative) or length (positive)
-int usb_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe, 
+int usb_internal_control_msg(struct usb_device *dev, unsigned int pipe, 
                            devrequest *cmd,  void *data, int len, int timeout)
 {
        urb_t *urb;
        int retv;
        int length;
 
+       CHECK;
+
        urb = usb_alloc_urb(0);
        if (!urb)
                return -ENOMEM;
   
-       FILL_CONTROL_URB(urb, usb_dev, pipe, (unsigned char*)cmd, data, len,    /* 
build urb */  
+       FILL_CONTROL_URB(urb, dev, pipe, (unsigned char*)cmd, data, len,    /* build 
+urb */  
                   (usb_complete_t)usb_api_blocking_completion,0);
 
        retv = usb_start_wait_urb(urb, timeout, &length);
@@ -624,6 +628,8 @@
 {
        devrequest *dr = kmalloc(sizeof(devrequest), GFP_KERNEL);
        int ret;
+
+       CHECK;
        
        if (!dr)
                return -ENOMEM;
@@ -647,11 +653,13 @@
 /* compatibility wrapper, builds bulk urb, and waits for completion */
 /* synchronous behavior */
 
-int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, 
+int usb_bulk_msg(struct usb_device *dev, unsigned int pipe, 
                        void *data, int len, int *actual_length, int timeout)
 {
        urb_t *urb;
 
+       CHECK;
+
        if (len < 0)
                return -EINVAL;
 
@@ -659,7 +667,7 @@
        if (!urb)
                return -ENOMEM;
 
-       FILL_BULK_URB(urb,usb_dev,pipe,(unsigned char*)data,len,   /* build urb */
+       FILL_BULK_URB(urb,dev,pipe,(unsigned char*)data,len,   /* build urb */
                        (usb_complete_t)usb_api_blocking_completion,0);
 
        return usb_start_wait_urb(urb,timeout,actual_length);
@@ -671,6 +679,11 @@
        urb_t *urb;
        api_wrapper_data *awd;
 
+       if ((!dev) || (pipe == -1)) {
+               printk(KERN_CRIT "Someone passed NULL to usb_request_bulk\n" );
+               return NULL;
+       }
+
        if (!(urb=usb_alloc_urb(0)))
                return NULL;
        if (!(awd = kmalloc(sizeof(api_wrapper_data), in_interrupt() ? GFP_ATOMIC : 
GFP_KERNEL))) {
@@ -699,6 +712,10 @@
 int usb_terminate_bulk(struct usb_device *dev, void *first)
 {
        urb_t *urb=(urb_t*)first;
+
+       if (!dev)
+               return -EINVAL;
+
        dbg("usb_terminate_bulk: urb:%p",urb);
        if (!urb) // none found? there is nothing to remove!
                return -ENODEV;
@@ -746,6 +763,7 @@
        urb_t *urb;
        unsigned int maxsze = usb_maxpacket(dev, pipe, usb_pipeout(pipe));
 
+       CHECK;
        *handle = NULL;
        
        //dbg("irq: dev:%p pipe:%08X handler:%p period:%d dev_id:%p max:%d", dev, 
pipe, handler, period, dev_id, maxsze);
@@ -807,7 +825,7 @@
        int     err;
        urb_t *urb = (urb_t*)handle;
 
-       if (!urb)
+       if ((!urb) || (!dev))
                return -EBADF;
        err=usb_unlink_urb(urb);
        kfree(urb->context);
@@ -1460,6 +1478,7 @@
        __u16 status;
        int endp=usb_pipeendpoint(pipe)|(usb_pipein(pipe)<<7);
 
+       CHECK;
 /*
        if (!usb_endpoint_halted(dev, endp & 0x0f, usb_endpoint_out(endp)))
                return 0;
--- clean/include/linux/usb.h   Sat Mar 25 22:47:44 2000
+++ linux/include/linux/usb.h   Mon Mar 27 23:46:13 2000
@@ -688,11 +688,15 @@
 
 static inline unsigned int __create_pipe(struct usb_device *dev, unsigned int 
endpoint)
 {
+       if (!dev)
+               return -1;
        return (dev->devnum << 8) | (endpoint << 15) | (dev->slow << 26) | 
dev->maxpacketsize;
 }
 
 static inline unsigned int __default_pipe(struct usb_device *dev)
 {
+       if (!dev)
+               return -1;
        return (dev->slow << 26);
 }
 

-- 
I'm [EMAIL PROTECTED] "In my country we have almost anarchy and I don't care."
Panos Katsaloulis describing me w.r.t. patents me at [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to