From: Dan Winship Date: Wed, 4 Apr 2012 14:21:24 +0000 (-0400) Subject: gchecksum: fix strict-aliasing warnings in the MD5 code X-Git-Tag: 2.32.1~57 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a81a0622027a21b71ba11677933f07b646cca151;p=platform%2Fupstream%2Fglib.git gchecksum: fix strict-aliasing warnings in the MD5 code https://bugzilla.gnome.org/show_bug.cgi?id=673191 --- diff --git a/glib/gchecksum.c b/glib/gchecksum.c index e860243..f543d96 100644 --- a/glib/gchecksum.c +++ b/glib/gchecksum.c @@ -67,7 +67,10 @@ typedef struct guint32 buf[4]; guint32 bits[2]; - guchar data[MD5_DATASIZE]; + union { + guchar data[MD5_DATASIZE]; + guint32 data32[MD5_DATASIZE / 4]; + } u; guchar digest[MD5_DIGEST_LEN]; } Md5sum; @@ -329,13 +332,13 @@ md5_sum_update (Md5sum *md5, md5->bits[1] += length >> 29; - /* bytes already in Md5sum->data */ + /* bytes already in Md5sum->u.data */ bit = (bit >> 3) & 0x3f; /* handle any leading odd-sized chunks */ if (bit) { - guchar *p = (guchar *) md5->data + bit; + guchar *p = md5->u.data + bit; bit = MD5_DATASIZE - bit; if (length < bit) @@ -346,8 +349,8 @@ md5_sum_update (Md5sum *md5, memcpy (p, data, bit); - md5_byte_reverse (md5->data, 16); - md5_transform (md5->buf, (guint32 *) md5->data); + md5_byte_reverse (md5->u.data, 16); + md5_transform (md5->buf, md5->u.data32); data += bit; length -= bit; @@ -356,17 +359,17 @@ md5_sum_update (Md5sum *md5, /* process data in 64-byte chunks */ while (length >= MD5_DATASIZE) { - memcpy (md5->data, data, MD5_DATASIZE); + memcpy (md5->u.data, data, MD5_DATASIZE); - md5_byte_reverse (md5->data, 16); - md5_transform (md5->buf, (guint32 *) md5->data); + md5_byte_reverse (md5->u.data, 16); + md5_transform (md5->buf, md5->u.data32); data += MD5_DATASIZE; length -= MD5_DATASIZE; } /* handle any remaining bytes of data */ - memcpy (md5->data, data, length); + memcpy (md5->u.data, data, length); } /* closes a checksum */ @@ -382,7 +385,7 @@ md5_sum_close (Md5sum *md5) /* Set the first char of padding to 0x80. * This is safe since there is always at least one byte free */ - p = md5->data + count; + p = md5->u.data + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ @@ -394,11 +397,11 @@ md5_sum_close (Md5sum *md5) /* Two lots of padding: Pad the first block to 64 bytes */ memset (p, 0, count); - md5_byte_reverse (md5->data, 16); - md5_transform (md5->buf, (guint32 *) md5->data); + md5_byte_reverse (md5->u.data, 16); + md5_transform (md5->buf, md5->u.data32); /* Now fill the next block with 56 bytes */ - memset (md5->data, 0, MD5_DATASIZE - 8); + memset (md5->u.data, 0, MD5_DATASIZE - 8); } else { @@ -406,20 +409,20 @@ md5_sum_close (Md5sum *md5) memset (p, 0, count - 8); } - md5_byte_reverse (md5->data, 14); + md5_byte_reverse (md5->u.data, 14); /* Append length in bits and transform */ - ((guint32 *) md5->data)[14] = md5->bits[0]; - ((guint32 *) md5->data)[15] = md5->bits[1]; + md5->u.data32[14] = md5->bits[0]; + md5->u.data32[15] = md5->bits[1]; - md5_transform (md5->buf, (guint32 *) md5->data); + md5_transform (md5->buf, md5->u.data32); md5_byte_reverse ((guchar *) md5->buf, 4); memcpy (md5->digest, md5->buf, 16); /* Reset buffers in case they contain sensitive data */ memset (md5->buf, 0, sizeof (md5->buf)); - memset (md5->data, 0, sizeof (md5->data)); + memset (md5->u.data, 0, sizeof (md5->u.data)); } static gchar *