[Spice-commits] common/canvas_base.c

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 5 08:39:07 UTC 2018

 common/canvas_base.c |   10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

New commits:
commit bb8d75bf3119802a286cb36d8575febece9b20d7
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Sun Dec 24 13:21:45 2017 +0000

    canvas_base: Avoid misaligned access decoding LZ4 data
    Make code faster on platforms not supporting unaligned access by
    SPICE_UNALIGNED_CAST is just silencing possible alignment warning and,
    if enabled, produces some logs, however in this case we know that the
    pointer can be misaligned.
    Use packed structures to tell compiler to generate best code possible.
    For more details see comment on commit 74e50b57ae05116be4e2 ("Make the
    compiler work out better way to write unaligned memory").
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Christophe Fergeau <cfergeau at redhat.com>

diff --git a/common/canvas_base.c b/common/canvas_base.c
index 276f67c..2fd60aa 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);

More information about the Spice-commits mailing list