Index: /trunk/src/VBox/Main/ApplianceImplIO.cpp
===================================================================
--- /trunk/src/VBox/Main/ApplianceImplIO.cpp	(revision 33642)
+++ /trunk/src/VBox/Main/ApplianceImplIO.cpp	(revision 33643)
@@ -439,5 +439,5 @@
     PRTTARSTORAGEINTERNAL pInt = (PRTTARSTORAGEINTERNAL)pvStorage;
 
-    DEBUG_PRINT_FLOW();
+//    DEBUG_PRINT_FLOW();
 
     return RTTarFileReadAt(pInt->file, uOffset, pvBuf, cbRead, pcbRead);
@@ -1055,5 +1055,5 @@
     AssertPtrReturn(pCallbacks, VERR_INVALID_PARAMETER);
 
-    DEBUG_PRINT_FLOW();
+//    DEBUG_PRINT_FLOW();
 
     PSHA1STORAGEINTERNAL pInt = (PSHA1STORAGEINTERNAL)pvStorage;
@@ -1082,5 +1082,7 @@
         if (   cbAvail == 0
             && pInt->fEOF)
-            return VERR_EOF;
+        {
+            break;
+        }
         /* If there isn't enough data make sure the worker thread is fetching
          * more. */
@@ -1111,4 +1113,5 @@
         RTCircBufReleaseReadBlock(pInt->pCircBuf, cbMemRead);
         cbAllRead += cbMemRead;
+
         pInt->cbCurAll += cbMemRead;
     }
@@ -1239,14 +1242,12 @@
         return rc;
 
+    void *pvTmpBuf = 0;
     void *pvBuf = 0;
-    uint64_t cbSize = 0;
+    uint64_t cbTmpSize = _1M;
+    size_t cbAllRead = 0;
     do
     {
-        rc = pCallbacks->pfnGetSize(pvUser, pvStorage, &cbSize);
-        if (RT_FAILURE(rc))
-            break;
-
-        pvBuf = RTMemAlloc(cbSize);
-        if (!pvBuf)
+        pvTmpBuf = RTMemAlloc(cbTmpSize);
+        if (!pvTmpBuf)
         {
             rc = VERR_NO_MEMORY;
@@ -1254,14 +1255,18 @@
         }
 
-        size_t cbAllRead = 0;
         for(;;)
         {
-            if (cbAllRead == cbSize)
+            size_t cbRead = 0;
+            rc = pCallbacks->pfnReadSync(pvUser, pvStorage, cbAllRead, pvTmpBuf, cbTmpSize, &cbRead);
+            if (   RT_FAILURE(rc)
+                || cbRead == 0)
                 break;
-            size_t cbToRead = cbSize - cbAllRead;
-            size_t cbRead = 0;
-            rc = pCallbacks->pfnReadSync(pvUser, pvStorage, cbAllRead, &((char*)pvBuf)[cbAllRead], cbToRead, &cbRead);
-            if (RT_FAILURE(rc))
+            pvBuf = RTMemRealloc(pvBuf, cbAllRead + cbRead);
+            if (!pvBuf)
+            {
+                rc = VERR_NO_MEMORY;
                 break;
+            }
+            memcpy(&((char*)pvBuf)[cbAllRead], pvTmpBuf, cbRead);
             cbAllRead += cbRead;
         }
@@ -1270,8 +1275,14 @@
     pCallbacks->pfnClose(pvUser, pvStorage);
 
+    if (rc == VERR_EOF)
+        rc = VINF_SUCCESS;
+
+    if (pvTmpBuf)
+        RTMemFree(pvTmpBuf);
+
     if (RT_SUCCESS(rc))
     {
         *ppvBuf = pvBuf;
-        *pcbSize = cbSize;
+        *pcbSize = cbAllRead;
     }else
     {
