[Spice-devel] [PATCH spice-common] canvas_base: Avoid misaligned access decoding LZ4 data

Frediano Ziglio fziglio at redhat.com
Thu Jun 28 06:40:19 UTC 2018


Make code faster on platforms not supporting unaligned access
by default.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 common/canvas_base.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/common/canvas_base.c b/common/canvas_base.c
index 6bf6e5d..36546b3 100644
--- a/common/canvas_base.c
+++ b/common/canvas_base.c
@@ -45,6 +45,14 @@
 #include "mem.h"
 #include "macros.h"
 
+#include <spice/start-packed.h>
+typedef struct SPICE_ATTR_PACKED {
+    uint32_t v;
+} uint32_unaligned_t;
+#include <spice/end-packed.h>
+
+#define read_uint32_be(ptr) ntohl(((uint32_unaligned_t *)(ptr))->v)
+
 #define ROUND(_x) ((int)floor((_x) + 0.5))
 
  static inline int fix_to_int(SPICE_FIXED28_4 fixed)
@@ -572,7 +580,7 @@ static pixman_image_t *canvas_get_lz4(CanvasBase *canvas, SpiceImage *image)
 
     do {
         // Read next compressed block
-        enc_size = ntohl(*SPICE_UNALIGNED_CAST(uint32_t *, data));
+        enc_size = read_uint32_be(data);
         data += 4;
         dec_size = LZ4_decompress_safe_continue(stream, (const char *) data,
                                                 (char *) dest, enc_size, available);
-- 
2.17.1



More information about the Spice-devel mailing list