From 6cbfa10eb5cc91e373681e2957d5b3f0b79ae57f Mon Sep 17 00:00:00 2001
From: Steve Ellcey <sje@cup.hp.com>
Date: Sun, 3 Jul 2005 15:40:29 +0000
Subject: [PATCH] re PR other/13906 (genmodes.c:964: internal compiler error:
 Bus error in md5_process_block)

	PR other/13906
	* md5.c (md5_process_bytes): Check alignment.

From-SVN: r101557
---
 libiberty/ChangeLog |  5 +++++
 libiberty/md5.c     | 17 +++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index eb19aa71e4c0..ba575549ada7 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,8 @@
+2005-07-03  Steve Ellcey  <sje@cup.hp.com>
+
+	PR other/13906
+	* md5.c (md5_process_bytes): Check alignment.
+
 2005-07-01  Ian Lance Taylor  <ian@airs.com>
 
 	PR other/22268
diff --git a/libiberty/md5.c b/libiberty/md5.c
index c03a74dffa2c..83e0beb339fa 100644
--- a/libiberty/md5.c
+++ b/libiberty/md5.c
@@ -223,6 +223,23 @@ md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
   /* Process available complete blocks.  */
   if (len > 64)
     {
+#if !_STRING_ARCH_unaligned
+/* To check alignment gcc has an appropriate operator.  Other
+   compilers don't.  */
+# if __GNUC__ >= 2
+#  define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0)
+# else
+#  define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0)
+# endif
+      if (UNALIGNED_P (buffer))
+        while (len > 64)
+          {
+            md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+            buffer = (const char *) buffer + 64;
+            len -= 64;
+          }
+      else
+#endif
       md5_process_block (buffer, len & ~63, ctx);
       buffer = (const void *) ((const char *) buffer + (len & ~63));
       len &= 63;
-- 
GitLab