When restoring a domain, check for unknown options in Image Header.  Nothing
good will come from attempting to continue.

Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com>
CC: David Vrabel <david.vra...@citrix.com>
CC: Ian Campbell <ian.campb...@citrix.com>
CC: Ian Jackson <ian.jack...@eu.citrix.com>
CC: Wei Liu <wei.l...@citrix.com>
CC: Yang Hongyang <yan...@cn.fujitsu.com>

---
David: The wording of the spec disallows even adding new options without
bumping the protocol version.  Do we want to relax the restriction slightly?
---
 docs/specs/libxc-migration-stream.pandoc |    5 +++--
 tools/libxc/xc_sr_restore.c              |    6 ++++++
 tools/libxc/xc_sr_stream_format.h        |    2 ++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/docs/specs/libxc-migration-stream.pandoc 
b/docs/specs/libxc-migration-stream.pandoc
index 520240f..fa501e7 100644
--- a/docs/specs/libxc-migration-stream.pandoc
+++ b/docs/specs/libxc-migration-stream.pandoc
@@ -131,11 +131,12 @@ version     0x00000002.  The version of this 
specification.
 
 options     bit 0: Endianness.  0 = little-endian, 1 = big-endian.
 
-            bit 1-15: Reserved.
+            bit 1-15: Reserved. (Must be zero)
 --------------------------------------------------------------------
 
 The endianness shall be 0 (little-endian) for images generated on an
-i386, x86_64, or arm host.
+i386, x86_64, or arm host.  The receiving side should confirm that no
+unexpected options have been specified.
 
 \clearpage
 
diff --git a/tools/libxc/xc_sr_restore.c b/tools/libxc/xc_sr_restore.c
index 0bf4bae..7d65a29 100644
--- a/tools/libxc/xc_sr_restore.c
+++ b/tools/libxc/xc_sr_restore.c
@@ -37,6 +37,12 @@ static int read_headers(struct xc_sr_context *ctx)
               ihdr.version, IHDR_VERSION);
         return -1;
     }
+    else if ( ihdr.options & IHDR_OPT_RSVD_MASK )
+    {
+        ERROR("Unknown options in Image Header: 0x%04x",
+              ihdr.options & IHDR_OPT_RSVD_MASK);
+        return -1;
+    }
     else if ( ihdr.options & IHDR_OPT_BIG_ENDIAN )
     {
         ERROR("Unable to handle big endian streams");
diff --git a/tools/libxc/xc_sr_stream_format.h 
b/tools/libxc/xc_sr_stream_format.h
index d116ca6..9d8c128 100644
--- a/tools/libxc/xc_sr_stream_format.h
+++ b/tools/libxc/xc_sr_stream_format.h
@@ -29,6 +29,8 @@ struct xc_sr_ihdr
 #define IHDR_OPT_LITTLE_ENDIAN (0 << _IHDR_OPT_ENDIAN)
 #define IHDR_OPT_BIG_ENDIAN    (1 << _IHDR_OPT_ENDIAN)
 
+#define IHDR_OPT_RSVD_MASK     (~(IHDR_OPT_BIG_ENDIAN))
+
 /*
  * Domain Header
  */
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

Reply via email to