Index: /trunk/src/VBox/VMM/SSM.cpp
===================================================================
--- /trunk/src/VBox/VMM/SSM.cpp	(revision 23667)
+++ /trunk/src/VBox/VMM/SSM.cpp	(revision 23668)
@@ -2066,14 +2066,28 @@
 
     if (pStrm->hIoThread != NIL_RTTHREAD)
-    {
         ASMAtomicWriteBool(&pStrm->fTerminating, true);
-        int rc2 = RTSemEventSignal(pStrm->fWrite ? pStrm->hEvtHead : pStrm->hEvtFree); AssertLogRelRC(rc2);
-        int rc3 = RTThreadWait(pStrm->hIoThread, RT_INDEFINITE_WAIT, NULL);            AssertLogRelRC(rc3);
+
+    int rc;
+    if (pStrm->fWrite)
+    {
+        int rc2 = RTSemEventSignal(pStrm->hEvtHead);                            AssertLogRelRC(rc2);
+        int rc3 = RTThreadWait(pStrm->hIoThread, RT_INDEFINITE_WAIT, NULL);     AssertLogRelRC(rc3);
         pStrm->hIoThread = NIL_RTTHREAD;
-    }
-
-    int rc = pStrm->pOps->pfnClose(pStrm->pvUser);
-    if (RT_FAILURE(rc))
-        ssmR3StrmSetError(pStrm, rc);
+
+        rc = pStrm->pOps->pfnClose(pStrm->pvUser);
+        if (RT_FAILURE(rc))
+            ssmR3StrmSetError(pStrm, rc);
+    }
+    else
+    {
+        rc = pStrm->pOps->pfnClose(pStrm->pvUser);
+        if (RT_FAILURE(rc))
+            ssmR3StrmSetError(pStrm, rc);
+
+        int rc2 = RTSemEventSignal(pStrm->hEvtFree);                            AssertLogRelRC(rc2);
+        int rc3 = RTThreadWait(pStrm->hIoThread, RT_INDEFINITE_WAIT, NULL);     AssertLogRelRC(rc3);
+        pStrm->hIoThread = NIL_RTTHREAD;
+    }
+
     pStrm->pOps   = NULL;
     pStrm->pvUser = NULL;
@@ -3612,5 +3626,6 @@
     VM_ASSERT_EMT0(pVM);
     AssertMsgReturn(   pSSM->enmAfter == SSMAFTER_DESTROY
-                    || pSSM->enmAfter == SSMAFTER_CONTINUE,
+                    || pSSM->enmAfter == SSMAFTER_CONTINUE
+                    || pSSM->enmAfter == SSMAFTER_MIGRATE,
                     ("%d\n", pSSM->enmAfter),
                     VERR_INVALID_PARAMETER);
@@ -4054,5 +4069,6 @@
     VM_ASSERT_EMT0(pVM);
     AssertMsgReturn(   pSSM->enmAfter == SSMAFTER_DESTROY
-                    || pSSM->enmAfter == SSMAFTER_CONTINUE,
+                    || pSSM->enmAfter == SSMAFTER_CONTINUE
+                    || pSSM->enmAfter == SSMAFTER_MIGRATE,
                     ("%d\n", pSSM->enmAfter),
                     VERR_INVALID_PARAMETER);
@@ -4444,5 +4460,6 @@
     VM_ASSERT_OTHER_THREAD(pVM);
     AssertMsgReturn(   pSSM->enmAfter == SSMAFTER_DESTROY
-                    || pSSM->enmAfter == SSMAFTER_CONTINUE,
+                    || pSSM->enmAfter == SSMAFTER_CONTINUE
+                    || pSSM->enmAfter == SSMAFTER_MIGRATE,
                     ("%d\n", pSSM->enmAfter),
                     VERR_INVALID_PARAMETER);
@@ -4644,5 +4661,6 @@
      */
     AssertMsgReturn(   enmAfter == SSMAFTER_DESTROY
-                    || enmAfter == SSMAFTER_CONTINUE,
+                    || enmAfter == SSMAFTER_CONTINUE
+                    || enmAfter == SSMAFTER_MIGRATE,
                     ("%d\n", enmAfter),
                     VERR_INVALID_PARAMETER);
Index: /trunk/src/VBox/VMM/VM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VM.cpp	(revision 23667)
+++ /trunk/src/VBox/VMM/VM.cpp	(revision 23668)
@@ -1587,7 +1587,10 @@
      * Validate input.
      */
-    AssertPtr(pszFilename);
+    AssertPtrNull(pszFilename);
+    AssertPtrNull(pStreamOps);
     AssertPtr(pVM);
-    Assert(enmAfter == SSMAFTER_DESTROY || enmAfter == SSMAFTER_CONTINUE);
+    Assert(   enmAfter == SSMAFTER_DESTROY
+           || enmAfter == SSMAFTER_CONTINUE
+           || enmAfter == SSMAFTER_MIGRATE);
     AssertPtr(ppSSM);
     *ppSSM = NULL;
