Index: /trunk/src/VBox/Main/include/MediumImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MediumImpl.h	(revision 67884)
+++ /trunk/src/VBox/Main/include/MediumImpl.h	(revision 67885)
@@ -109,4 +109,5 @@
     bool i_isMediumFormatFile() const;
     uint64_t i_getSize() const;
+    uint64_t i_getLogicalSize() const;
     DeviceType_T i_getDeviceType() const;
     MediumType_T i_getType() const;
Index: /trunk/src/VBox/Main/src-server/MediumImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/MediumImpl.cpp	(revision 67884)
+++ /trunk/src/VBox/Main/src-server/MediumImpl.cpp	(revision 67885)
@@ -3811,4 +3811,13 @@
 {
     return m->size;
+}
+
+/**
+ * Internal method to return the medium's size. Must have caller + locking!
+ * @return
+ */
+uint64_t Medium::i_getLogicalSize() const
+{
+    return m->logicalSize;
 }
 
Index: /trunk/src/VBox/Main/src-server/SnapshotImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/SnapshotImpl.cpp	(revision 67884)
+++ /trunk/src/VBox/Main/src-server/SnapshotImpl.cpp	(revision 67885)
@@ -2805,4 +2805,13 @@
             // base image. Important e.g. for medium formats which do not have
             // a file representation such as iSCSI.
+
+            // not going to merge a big source into a small target
+            if (pSource->i_getLogicalSize() > pTarget->i_getLogicalSize())
+            {
+                rc = setError(E_FAIL,
+                              tr("Unable to merge storage '%s', because it is smaller than the source image. If you resize it to have a capacity of at least %lld bytes you can retry"),
+                              pTarget->i_getLocationFull().c_str(), pSource->i_getLogicalSize());
+                throw rc;
+            }
 
             // a couple paranoia checks for backward merges
