]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
libxenguest: add get_unaligned_le32()
authorJan Beulich <jbeulich@suse.com>
Tue, 26 Jan 2021 13:14:39 +0000 (14:14 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 26 Jan 2021 13:14:39 +0000 (14:14 +0100)
Abstract xc_dom_check_gzip()'s reading of the uncompressed size into a
helper re-usable, in particular, by other decompressor code.

Sadly in the mini-os case this conflicts with other functions of the
same name (and purpose), which can't be easily replaced individually.
Yet it was requested that no full set of helpers be introduced at this
point in the release cycle. Hence the awkward XG_NEED_UNALIGNED.

Requested-by: Ian Jackson <iwj@xenproject.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com>
Release-Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libs/guest/xg_dom_core.c
tools/libs/guest/xg_dom_decompress_lz4.c
tools/libs/guest/xg_private.h
xen/common/lz4/defs.h

index f846d8e1ed9189f6d88a91156fc8f7b9f2e410e2..98ef8e8fc9ca274ca46941243618f596251d5e69 100644 (file)
@@ -31,6 +31,7 @@
 #include <zlib.h>
 #include <assert.h>
 
+#define XG_NEED_UNALIGNED
 #include "xg_private.h"
 #include "_paths.h"
 
@@ -325,7 +326,6 @@ int xc_dom_kernel_check_size(struct xc_dom_image *dom, size_t sz)
 
 size_t xc_dom_check_gzip(xc_interface *xch, void *blob, size_t ziplen)
 {
-    unsigned char *gzlen;
     size_t unziplen;
 
     if ( ziplen < 6 )
@@ -337,8 +337,7 @@ size_t xc_dom_check_gzip(xc_interface *xch, void *blob, size_t ziplen)
         /* not gzipped */
         return 0;
 
-    gzlen = blob + ziplen - 4;
-    unziplen = (size_t)gzlen[3] << 24 | gzlen[2] << 16 | gzlen[1] << 8 | gzlen[0];
+    unziplen = get_unaligned_le32(blob + ziplen - 4);
     if ( unziplen > XC_DOM_DECOMPRESS_MAX )
     {
         xc_dom_printf
index 97ba620d86f92a1a06ac9dc63abbd95edbda747f..34a1a13d84db46c487811ef477e761fb564c9047 100644 (file)
@@ -3,6 +3,7 @@
 #include <inttypes.h>
 #include <stdint.h>
 
+#define XG_NEED_UNALIGNED
 #include "xg_private.h"
 #include "xg_dom_decompress.h"
 
index c3ed8c1257df883aab18b2cf69e0ddb5a76d030e..8f9b257a2f3d6d0aa6b25a070f0393593aeef6e2 100644 (file)
@@ -62,6 +62,15 @@ char *xc_inflate_buffer(xc_interface *xch,
                         unsigned long in_size,
                         unsigned long *out_size);
 
+#if !defined(__MINIOS__) || defined(XG_NEED_UNALIGNED)
+
+static inline unsigned int get_unaligned_le32(const uint8_t *buf)
+{
+    return ((unsigned int)buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+}
+
+#endif /* !__MINIOS__ || XG_NEED_UNALIGNED */
+
 unsigned long csum_page (void * page);
 
 #define _PAGE_PRESENT   0x001
index 4fbea2ac3dd4fe0cbe81314faa1f19902b8afc0d..10609f5a53170f5e01bd020d43d6c0f8f3148946 100644 (file)
@@ -18,11 +18,6 @@ static inline u16 get_unaligned_le16(const void *p)
        return le16_to_cpup(p);
 }
 
-static inline u32 get_unaligned_le32(const void *p)
-{
-       return le32_to_cpup(p);
-}
-
 #endif
 
 /*