Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64c948bf authored by Tomasz Mikolajewski's avatar Tomasz Mikolajewski
Browse files

Fix sending object info in MTP stack.

This CL fixes three bugs:
1. Wrong condition, which caused MtpDevice::sendData always return false.
2. Sending data separately was incompatible with the server side, causing
   receiving only partial data on the server side.
3. Sending uninitialized buffers (sic!) from MtpDevice::sendObjectInfo
   due to missing call to reset().
4. Sending corrupted packets from MtpDevice::sendObjectInfo (shifted by
   4 bytes) due to missing reset().
5. Sending incorrect parent in MtpDevice::sendObjectInfo in case of not
   specified parent.

Change-Id: Ia545c66b388ea9a292ba31f6ff034e2467037d92
parent 58bfa487
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -525,16 +525,9 @@ int MtpDataPacket::writeDataHeader(struct usb_request *request, uint32_t length)
int MtpDataPacket::write(struct usb_request *request) {
    MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
    MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);

    // send header separately from data
    request->buffer = mBuffer;
    request->buffer_length = MTP_CONTAINER_HEADER_SIZE;
    request->buffer_length = mPacketSize;
    int ret = transfer(request);
    if (ret == MTP_CONTAINER_HEADER_SIZE) {
        request->buffer = mBuffer + MTP_CONTAINER_HEADER_SIZE;
        request->buffer_length = mPacketSize - MTP_CONTAINER_HEADER_SIZE;
        ret = transfer(request);
    }
    return (ret < 0 ? ret : 0);
}

+3 −2
Original line number Diff line number Diff line
@@ -430,8 +430,9 @@ MtpObjectHandle MtpDevice::sendObjectInfo(MtpObjectInfo* info) {
        parent = MTP_PARENT_ROOT;

    mRequest.setParameter(1, info->mStorageID);
    mRequest.setParameter(2, info->mParent);
    mRequest.setParameter(2, parent);

    mData.reset();
    mData.putUInt32(info->mStorageID);
    mData.putUInt16(info->mFormat);
    mData.putUInt16(info->mProtectionStatus);
@@ -807,7 +808,7 @@ bool MtpDevice::sendData() {
    mData.setTransactionID(mRequest.getTransactionID());
    int ret = mData.write(mRequestOut);
    mData.dump();
    return (ret > 0);
    return (ret >= 0);
}

bool MtpDevice::readData() {