From: Eric Sesterhenn <[EMAIL PROTECTED]>

This fixes coverity Bug #390.

With the following code

        ret = ep->branch = balance(isp116x, ep->period, ep->load);
        if (ret < 0)
                goto fail;

the problem is that ret and balance are of the type int, and ep->branch is u16.
so the int balance() returns gets reduced to u16 and then converted to an int 
again,
which removes the sign. Maybe the following little c program can explain it 
better:

----snip----
int foo() {
        return -5;
}

int main(int argc, char **argv) {
        int a;
        unsigned short b;

        a = b = foo();
        if (a < 0)
                puts("case 1 works\n");

        b = a = foo();
        if (a < 0 )
                puts("case 2 works\n");
}
----snip----

only the case 2 output is visible.

Signed-off-by: Eric Sesterhenn <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 drivers/usb/host/isp116x-hcd.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff -puN 
drivers/usb/host/isp116x-hcd.c~usb-negative-index-in-drivers-usb-host-isp116x-hcdc
 drivers/usb/host/isp116x-hcd.c
--- 
devel/drivers/usb/host/isp116x-hcd.c~usb-negative-index-in-drivers-usb-host-isp116x-hcdc
    2006-06-01 20:48:09.000000000 -0700
+++ devel-akpm/drivers/usb/host/isp116x-hcd.c   2006-06-01 20:48:09.000000000 
-0700
@@ -781,7 +781,7 @@ static int isp116x_urb_enqueue(struct us
                if (ep->branch < PERIODIC_SIZE)
                        break;
 
-               ret = ep->branch = balance(isp116x, ep->period, ep->load);
+               ep->branch = ret = balance(isp116x, ep->period, ep->load);
                if (ret < 0)
                        goto fail;
                ret = 0;
_


_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to