md5.c (md5_read_ctx): Handle mis-aligned resbuf pointer.
authorSteve Ellcey <sje@cup.hp.com>
Fri, 12 Aug 2011 16:06:57 +0000 (16:06 +0000)
committerSteve Ellcey <sje@gcc.gnu.org>
Fri, 12 Aug 2011 16:06:57 +0000 (16:06 +0000)
2011-08-12  Steve Ellcey  <sje@cup.hp.com>

* md5.c (md5_read_ctx): Handle mis-aligned resbuf pointer.

From-SVN: r177700

libiberty/ChangeLog
libiberty/md5.c

index fe9da85587f462be343fb90498aec25f9f5a5897..eabc69dc7ff4663b4ac8b8d16ce43dd9a9d40912 100644 (file)
@@ -1,3 +1,7 @@
+2011-08-12  Steve Ellcey  <sje@cup.hp.com>
+
+       * md5.c (md5_read_ctx): Handle mis-aligned resbuf pointer.
+
 2011-08-06  Uros Bizjak  <ubizjak@gmail.com>
 
        * testsuite/test-expandargv.c (writeout_test): Check result of fwrite.
index 9de9d88c22a52e3e334b3fcfbee25b856aa5009c..11920e1b5559a4bedd08ead2c149cbbfc1e024a9 100644 (file)
@@ -76,15 +76,19 @@ md5_init_ctx (struct md5_ctx *ctx)
 /* Put result from CTX in first 16 bytes following RESBUF.  The result
    must be in little endian byte order.
 
-   IMPORTANT: On some systems it is required that RESBUF is correctly
-   aligned for a 32 bits value.  */
+   IMPORTANT: RESBUF may not be aligned as strongly as MD5_UNIT32 so we
+   put things in a local (aligned) buffer first, then memcpy into RESBUF.  */
 void *
 md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
 {
-  ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
-  ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
-  ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
-  ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
+  md5_uint32 buffer[4];
+
+  buffer[0] = SWAP (ctx->A);
+  buffer[1] = SWAP (ctx->B);
+  buffer[2] = SWAP (ctx->C);
+  buffer[3] = SWAP (ctx->D);
+
+  memcpy (resbuf, buffer, 16);
 
   return resbuf;
 }