diff options
| author | Jerry Zhang <zhangjerry@google.com> | 2017-09-27 11:49:44 -0700 |
|---|---|---|
| committer | Greg Hackmann <ghackmann@google.com> | 2018-10-18 19:43:15 +0000 |
| commit | 34e65b671bc7bd047847dd7e67392dc55585d5cf (patch) | |
| tree | 6b6d39737047368c92aa866ff867ec25b37dfb8d | |
| parent | 7a95540418bec4adafff304587715ffbc37d3fd9 (diff) | |
ANDROID: usb: gadget: f_mtp: Return error if count is negative
If the user passes in a negative file size in a int64,
this will compare to be smaller than buffer length,
and it will get truncated to form a read length that
is larger than the buffer length.
To fix, return -EINVAL if the count argument is negative,
so the loop will never happen.
Bug: 37429972
Test: Test with PoC
Change-Id: I5d52e38e6fbe2c17eb8c493f9eb81df6cfd780a4
Signed-off-by: Jerry Zhang <zhangjerry@google.com>
| -rw-r--r-- | drivers/usb/gadget/function/f_mtp.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/usb/gadget/function/f_mtp.c b/drivers/usb/gadget/function/f_mtp.c index b25cb3594d01..78b110dd2977 100644 --- a/drivers/usb/gadget/function/f_mtp.c +++ b/drivers/usb/gadget/function/f_mtp.c @@ -729,6 +729,11 @@ static void send_file_work(struct work_struct *data) offset = dev->xfer_file_offset; count = dev->xfer_file_length; + if (count < 0) { + dev->xfer_result = -EINVAL; + return; + } + DBG(cdev, "send_file_work(%lld %lld)\n", offset, count); if (dev->xfer_send_header) { @@ -835,6 +840,11 @@ static void receive_file_work(struct work_struct *data) offset = dev->xfer_file_offset; count = dev->xfer_file_length; + if (count < 0) { + dev->xfer_result = -EINVAL; + return; + } + DBG(cdev, "receive_file_work(%lld)\n", count); while (count > 0 || write_req) { |
