[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 1/2] usb-mtp: fix sending files larger than 4
From: |
Bandan Das |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/2] usb-mtp: fix sending files larger than 4gb |
Date: |
Wed, 27 Jul 2016 16:30:15 -0400 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Hi Isaac,
Some minor comments below.
Isaac Lozano <address@hidden> writes:
> MTP requires that if a file is larger than 4gb or if sending data larger
> than 4gb, that the length field be set to 0xFFFFFFFF.
>
> Also widened a couple variables to prevent overflow errors.
>
> Signed-off-by: Isaac Lozano <address@hidden>
> ---
> hw/usb/dev-mtp.c | 21 ++++++++++++++++-----
> 1 file changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/hw/usb/dev-mtp.c b/hw/usb/dev-mtp.c
> index 1be85ae..6f6a270 100644
> --- a/hw/usb/dev-mtp.c
> +++ b/hw/usb/dev-mtp.c
> @@ -115,8 +115,8 @@ struct MTPControl {
> struct MTPData {
> uint16_t code;
> uint32_t trans;
> - uint32_t offset;
> - uint32_t length;
> + uint64_t offset;
> + uint64_t length;
> uint32_t alloc;
> uint8_t *data;
> bool first;
> @@ -883,7 +883,13 @@ static MTPData *usb_mtp_get_object_info(MTPState *s,
> MTPControl *c,
> usb_mtp_add_u32(d, QEMU_STORAGE_ID);
> usb_mtp_add_u16(d, o->format);
> usb_mtp_add_u16(d, 0);
> - usb_mtp_add_u32(d, o->stat.st_size);
> +
> + if (o->stat.st_size > 0xFFFFFFFF) {
> + usb_mtp_add_u32(d, 0xFFFFFFFF);
> + }
> + else {
> + usb_mtp_add_u32(d, o->stat.st_size);
> + }
Or rewrite as:
uint32_t size =
o->stat.st_size > 0xFFFFFFFF ? 0xFFFFFFFF : o->stat.st_size;
usb_mtp_add_u32(d, size);
Either way is fine.
>
> usb_mtp_add_u16(d, 0);
> usb_mtp_add_u32(d, 0);
> @@ -1193,10 +1199,15 @@ static void usb_mtp_handle_data(USBDevice *dev,
> USBPacket *p)
> }
> if (s->data_in != NULL) {
> MTPData *d = s->data_in;
> - int dlen = d->length - d->offset;
> + uint64_t dlen = d->length - d->offset;
> if (d->first) {
> trace_usb_mtp_data_in(s->dev.addr, d->trans, d->length);
> - container.length = cpu_to_le32(d->length +
> sizeof(container));
> + if (d->length + sizeof(container) > 0xFFFFFFFF) {
> + container.length = cpu_to_le32(0xFFFFFFFF);
> + }
> + else {
> + container.length = cpu_to_le32(d->length +
> sizeof(container));
> + }
This will throw checkpatch errors and I see you have fixed them in the next
patch.
Please just use the preferred style here to keep context.
> container.type = cpu_to_le16(TYPE_DATA);
> container.code = cpu_to_le16(d->code);
> container.trans = cpu_to_le32(d->trans);
Please feel free to add
Reviewed-by: Bandan Das <address@hidden>