merge from gcc
authorDJ Delorie <dj@redhat.com>
Fri, 12 Aug 2011 18:44:43 +0000 (18:44 +0000)
committerDJ Delorie <dj@redhat.com>
Fri, 12 Aug 2011 18:44:43 +0000 (18:44 +0000)
libiberty/ChangeLog
libiberty/md5.c

index fe9da85..eabc69d 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 9de9d88..11920e1 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;
 }