Merge "Read whole data from MTP device even on writing error."
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp
index d54ce50..b84a245 100644
--- a/media/mtp/MtpDevice.cpp
+++ b/media/mtp/MtpDevice.cpp
@@ -683,7 +683,6 @@
     return result;
 }
 
-
 // reads the object's data and writes it to the specified file path
 bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int group, int perm) {
     ALOGD("readObject: %s", destPath);
@@ -708,25 +707,26 @@
     ALOGD("readObject: %d", fd);
 
     Mutex::Autolock autoLock(mMutex);
-    bool result = false;
 
     mRequest.reset();
     mRequest.setParameter(1, handle);
-    if (sendRequest(MTP_OPERATION_GET_OBJECT)
-            && mData.readDataHeader(mRequestIn1)) {
+    if (sendRequest(MTP_OPERATION_GET_OBJECT) && mData.readDataHeader(mRequestIn1)) {
         uint32_t length = mData.getContainerLength();
-        if (length < MTP_CONTAINER_HEADER_SIZE)
-            goto fail;
+        if (length < MTP_CONTAINER_HEADER_SIZE) {
+            ALOGE("Invalid container length.");
+            return false;
+        }
         length -= MTP_CONTAINER_HEADER_SIZE;
         uint32_t remaining = length;
 
+        bool writingError = false;
         int initialDataLength = 0;
         void* initialData = mData.getData(initialDataLength);
         if (initialData) {
             if (initialDataLength > 0) {
                 if (write(fd, initialData, initialDataLength) != initialDataLength) {
-                    free(initialData);
-                    goto fail;
+                    ALOGE("Failed to write initial data.");
+                    writingError = true;
                 }
                 remaining -= initialDataLength;
             }
@@ -747,29 +747,27 @@
                 req->buffer_length = (remaining > sizeof(buffer1) ? sizeof(buffer1) : remaining);
                 if (mData.readDataAsync(req)) {
                     ALOGE("readDataAsync failed");
-                    goto fail;
+                    return false;
                 }
             } else {
                 req = NULL;
             }
 
-            if (writeBuffer) {
+            if (writeBuffer && !writingError) {
                 // write previous buffer
                 if (write(fd, writeBuffer, writeLength) != writeLength) {
-                    ALOGE("write failed");
-                    // wait for pending read before failing
-                    if (req)
-                        mData.readDataWait(mDevice);
-                    goto fail;
+                    writingError = true;
                 }
-                writeBuffer = NULL;
             }
+            writeBuffer = NULL;
 
             // wait for read to complete
             if (req) {
                 int read = mData.readDataWait(mDevice);
-                if (read < 0)
-                    goto fail;
+                if (read < 0) {
+                    ALOGE("readDataWait failed.");
+                    return false;
+                }
 
                 if (read > 0) {
                     writeBuffer = req->buffer;
@@ -783,12 +781,10 @@
         }
 
         MtpResponseCode response = readResponse();
-        if (response == MTP_RESPONSE_OK)
-            result = true;
+        return response == MTP_RESPONSE_OK && !writingError;
     }
 
-fail:
-    return result;
+    return false;
 }
 
 bool MtpDevice::sendRequest(MtpOperationCode operation) {