From 031a99907ec2c61636dacf1d330c749cfa469b0d Mon Sep 17 00:00:00 2001
From: Mathis Rosenhauer <rosenhauer@dkrz.de>
Date: Tue, 4 Sep 2018 13:41:12 +0200
Subject: [PATCH] Fix #6 ubsan issue in encoding

---
 src/encode.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/encode.c b/src/encode.c
index 63dc6f4..713e3d7 100644
--- a/src/encode.c
+++ b/src/encode.c
@@ -272,29 +272,30 @@ static void preprocess_signed(struct aec_stream *strm)
 
     uint32_t D;
     struct internal_state *state = strm->state;
-    int32_t *restrict x = (int32_t *)state->data_raw;
+    uint32_t *restrict x = state->data_raw;
     uint32_t *restrict d = state->data_pp;
-    int32_t xmax = (int32_t)state->xmax;
-    int32_t xmin = (int32_t)state->xmin;
+    uint32_t xmax = state->xmax;
+    uint32_t xmin = state->xmin;
     uint32_t rsi = strm->rsi * strm->block_size - 1;
-    uint32_t m = UINT64_C(1) << (strm->bits_per_sample - 1);
+    uint32_t m = UINT32_C(1) << (strm->bits_per_sample - 1);
 
     state->ref = 1;
     state->ref_sample = x[0];
     d[0] = 0;
+    /* Sign extension */
     x[0] = (x[0] ^ m) - m;
 
     for (size_t i = 0; i < rsi; i++) {
         x[i + 1] = (x[i + 1] ^ m) - m;
-        if (x[i + 1] < x[i]) {
-            D = (uint32_t)(x[i] - x[i + 1]);
-            if (D <= (uint32_t)(xmax - x[i]))
+        if ((int32_t)x[i + 1] < (int32_t)x[i]) {
+            D = x[i] - x[i + 1];
+            if (D <= xmax - x[i])
                 d[i + 1] = 2 * D - 1;
             else
                 d[i + 1] = xmax - x[i + 1];
         } else {
-            D = (uint32_t)(x[i + 1] - x[i]);
-            if (D <= (uint32_t)(x[i] - xmin))
+            D = x[i + 1] - x[i];
+            if (D <= x[i] - xmin)
                 d[i + 1] = 2 * D;
             else
                 d[i + 1] = x[i + 1] - xmin;
-- 
GitLab