usb: gadget: prevent a ternary sign expansion bug
Subsystems (2)
PATCH 1/1 usb: gadget: prevent a ternary sign expansion bug
The problem is that "req->actual" is a u32, "req->status" is an int, and iocb->ki_complete() takes a long. We would expect that a negative error code in "req->status" would translate to a negative long value.
But what actually happens is that because "req->actual" is a u32, the error codes is type promoted to a high positive value and then remains a positive value when it is cast to long. (No sign expansion).
We can fix this by casting "req->status" to long.
--- drivers/usb/gadget/legacy/inode.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/gadget/legacy/inode.c +2 -1
@@ -498,7 +498,8 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req) iocb->private =NULL ;/* aio_complete() reports bytes-transferred _and_ faults */ - iocb->ki_complete (iocb, req->actual ? req->actual : req->status, + iocb->ki_complete (iocb, + req->actual ? req->actual : (long )req->status, req->status); }else {/* ep_copy_to_user() won't report both; we hide some faults */
Signature · 1 line
2.30.2
Quoted 11 lines · Dan Carpenter
The problem is that "
req->actual" is a u32, "req->status" is an int, andiocb->ki_complete()takes a long. We would expect that a negative error code in "req->status" would translate to a negative long value.But what actually happens is that because "
req->actual" is a u32, the error codes is type promoted to a high positive value and then remains a positive value when it is cast to long. (No sign expansion).We can fix this by casting "
req->status" to long.Signed-off-by Dan Carpenter <[email protected]>
I'm just going to assume your type promotion rank is correct :-)
Signature · 1 line
balbi