]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
basenc: avoid undefined behaviour in z85 processing
authorPádraig Brady <P@draigBrady.com>
Wed, 4 Mar 2020 12:24:49 +0000 (12:24 +0000)
committerPádraig Brady <P@draigBrady.com>
Wed, 4 Mar 2020 12:38:27 +0000 (12:38 +0000)
* src/basenc.c (z85_decode_ctx_init): Ensure we're working
with unsigned, as otherwise ubsan triggers with:
  src/basenc.c:767:18: runtime error: signed integer overflow:
  43 * 52200625 cannot be represented in type 'int'
(z85_encode): Likewise to avoid the usban error:
  src/basenc.c:630:26: runtime error:
  left shift of 134 by 24 places cannot be represented in type 'int'

src/basenc.c

index 9fb2ab95576c4076848e8eeea4bc95efd9fc6590..13c37f9048e67103cee9cc916c14d22d9194eceb 100644 (file)
@@ -627,7 +627,10 @@ z85_encode (const char *restrict in, size_t inlen,
       /* Got a quad, encode it */
       if (i == 4)
         {
-          val = (quad[0] << 24) + (quad[1] << 16) + (quad[2] << 8) + quad[3];
+          val = ((uint32_t) quad[0] << 24)
+                + ((uint32_t) quad[1] << 16)
+                + ((uint32_t) quad[2] << 8)
+                + quad[3];
 
           for (int j = 4; j>=0; --j)
             {
@@ -665,7 +668,7 @@ z85_decode_ctx_init (struct base_decode_context *ctx)
 
 
 # define Z85_HI_CTX_TO_32BIT_VAL(ctx) \
-  ((ctx)->ctx.z85.octets[0] * 85 * 85 * 85 * 85 )
+  ((uint32_t)(ctx)->ctx.z85.octets[0] * 85 * 85 * 85 * 85 )
 
 /*
  0 -  9:  0 1 2 3 4 5 6 7 8 9