Index: /trunk/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp	(revision 55822)
+++ /trunk/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp	(revision 55823)
@@ -305,4 +305,5 @@
         return setError(E_INVALIDARG, tr("Another drop operation already is in progress"));
 
+    /* Gets reset when the thread is finished. */
     ASMAtomicWriteBool(&mDataBase.mfTransferIsPending, true);
 
@@ -324,4 +325,6 @@
         RecvDataTask *pTask = new RecvDataTask(this, &mData.mRecvCtx);
         AssertReturn(pTask->isOk(), pTask->getRC());
+        
+        LogFlowFunc(("Starting thread ...\n"));
 
         int rc = RTThreadCreate(NULL, GuestDnDSource::i_receiveDataThread,
@@ -786,8 +789,8 @@
     ASMAtomicWriteBool(&pSource->mDataBase.mfTransferIsPending, false);
 
-    LogFlowFunc(("pSource=%p returning rc=%Rrc\n", (GuestDnDSource *)pSource, rc));
-
     if (pTask)
         delete pTask;
+
+    LogFlowFunc(("pSource=%p returning rc=%Rrc\n", (GuestDnDSource *)pSource, rc));
     return rc;
 }
@@ -1022,4 +1025,6 @@
 
     int rc = VINF_SUCCESS;
+
+    int rcCallback = VINF_SUCCESS; /* rc for the callback. */
     bool fNotify = false;
 
@@ -1092,7 +1097,9 @@
 
             pCtx->mpResp->reset();
+            if (RT_SUCCESS(pCBData->rc))
+                pCBData->rc = VERR_GENERAL_FAILURE; /* Make sure some error is set. */
             rc = pCtx->mpResp->setProgress(100, DragAndDropSvc::DND_PROGRESS_ERROR, pCBData->rc);
             if (RT_SUCCESS(rc))
-                rc = pCBData->rc;
+                rcCallback = pCBData->rc;
             break;
         }
@@ -1103,6 +1110,11 @@
     }
 
-    if (RT_FAILURE(rc))
+    if (   RT_FAILURE(rc)
+        || RT_FAILURE(rcCallback))
+    {
         fNotify = true;
+        if (RT_SUCCESS(rcCallback))
+            rcCallback = rc;
+    }
 
     /* All URI data processed? */
@@ -1113,10 +1125,10 @@
     }
 
-    LogFlowFunc(("cbProcessed=%RU64, cbToProcess=%RU64, fNotify=%RTbool, rc=%Rrc\n",
-                 pCtx->mData.cbProcessed, pCtx->mData.cbToProcess, fNotify, rc));
+    LogFlowFunc(("cbProcessed=%RU64, cbToProcess=%RU64, fNotify=%RTbool, rcCallback=%Rrc, rc=%Rrc\n",
+                 pCtx->mData.cbProcessed, pCtx->mData.cbToProcess, fNotify, rcCallback, rc));
 
     if (fNotify)
     {
-        int rc2 = pCtx->mCallback.Notify(rc);
+        int rc2 = pCtx->mCallback.Notify(rcCallback);
         AssertRC(rc2);
     }
