From 9fdbf217bb1cf73b8dadaa10b6da00e2391d2706 Mon Sep 17 00:00:00 2001
From: Tristan Matthews <tristan.matthews@savoirfairelinux.com>
Date: Wed, 10 Jul 2013 16:30:26 -0400
Subject: [PATCH] * #27096: iax: use union instead of dereferencing type-punned
 pointer

Patch sent upstream at https://sourceforge.net/p/iaxclient/bugs/43/
---
 daemon/libs/iax2/md5.c | 8 ++++----
 daemon/libs/iax2/md5.h | 5 ++++-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/daemon/libs/iax2/md5.c b/daemon/libs/iax2/md5.c
index d84c66b892..3830a61fda 100644
--- a/daemon/libs/iax2/md5.c
+++ b/daemon/libs/iax2/md5.c
@@ -116,7 +116,7 @@ void IAX_MD5Update(struct IAX_MD5Context *ctx, uint8_t const *buf, unsigned int
 	}
 	memcpy(p, buf, t);
 	IAX_byteReverse(ctx->in, 16);
-	IAX_MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+	IAX_MD5Transform(ctx->buf, ctx->in_32);
 	buf += t;
 	len -= t;
     }
@@ -171,10 +171,10 @@ void IAX_MD5Final(uint8_t digest[16], struct IAX_MD5Context *ctx)
     IAX_byteReverse(ctx->in, 14);
 
     /* Append length in bits and transform */
-    ((uint32_t *) ctx->in)[14] = ctx->bits[0];
-    ((uint32_t *) ctx->in)[15] = ctx->bits[1];
+    ctx->in_32[14] = ctx->bits[0];
+    ctx->in_32[15] = ctx->bits[1];
 
-    IAX_MD5Transform(ctx->buf, (uint32_t *) ctx->in);
+    IAX_MD5Transform(ctx->buf, ctx->in_32);
     IAX_byteReverse((uint8_t *) ctx->buf, 4);
     memcpy(digest, ctx->buf, 16);
     memset(ctx, 0, sizeof(*ctx));	/* In case it's sensitive */
diff --git a/daemon/libs/iax2/md5.h b/daemon/libs/iax2/md5.h
index b3ad37a9b3..f54b68bfb2 100644
--- a/daemon/libs/iax2/md5.h
+++ b/daemon/libs/iax2/md5.h
@@ -11,7 +11,10 @@ typedef unsigned char uint8_t;
 struct IAX_MD5Context {
 	uint32_t buf[4];
 	uint32_t bits[2];
-	uint8_t in[64];
+	union {
+	    uint8_t in[64];
+	    uint32_t in_32[16];
+	};
 };
 
 void IAX_MD5Init(struct IAX_MD5Context *context);
-- 
GitLab