[前][次][番号順一覧][スレッド一覧]

ruby-changes:20498

From: nahi <ko1@a...>
Date: Fri, 15 Jul 2011 12:03:43 +0900 (JST)
Subject: [ruby-changes:20498] nahi:r32546 (trunk): * ext/digest/sha2/sha2.c (SHA256_Update, SHA512_Update): avoid Bus

nahi	2011-07-15 12:03:31 +0900 (Fri, 15 Jul 2011)

  New Revision: 32546

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32546

  Log:
    * ext/digest/sha2/sha2.c (SHA256_Update, SHA512_Update): avoid Bus
      Error caused by unalignment access on Sparc-Solaris (and possibly on
      other similar environment.) This patch just do memcpy always instead
      of checking architecture. I see no perf drop on my 64bit env. For
      more details, see #4320.
    
    * test/digest/test_digest.rb: add test for unalignment access.

  Modified files:
    trunk/ChangeLog
    trunk/ext/digest/sha2/sha2.c
    trunk/test/digest/test_digest.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32545)
+++ ChangeLog	(revision 32546)
@@ -1,3 +1,13 @@
+Fri Jul 15 09:10:41 2011  Hiroshi Nakamura  <nahi@r...>
+
+	* ext/digest/sha2/sha2.c (SHA256_Update, SHA512_Update): avoid Bus
+	  Error caused by unalignment access on Sparc-Solaris (and possibly on
+	  other similar environment.) This patch just do memcpy always instead
+	  of checking architecture. I see no perf drop on my 64bit env. For
+	  more details, see #4320.
+
+	* test/digest/test_digest.rb: add test for unalignment access.
+
 Fri Jul 15 01:51:25 2011  Nobuyoshi Nakada  <nobu@r...>
 
 	* regint.h (PLATFORM_UNALIGNED_WORD_ACCESS): Power PC does not
Index: ext/digest/sha2/sha2.c
===================================================================
--- ext/digest/sha2/sha2.c	(revision 32545)
+++ ext/digest/sha2/sha2.c	(revision 32546)
@@ -559,7 +559,8 @@
 	}
 	while (len >= SHA256_BLOCK_LENGTH) {
 		/* Process as many complete blocks as we can */
-		SHA256_Transform(context, (sha2_word32*)data);
+		MEMCPY_BCOPY(context->buffer, data, SHA256_BLOCK_LENGTH);
+		SHA256_Transform(context, (sha2_word32*)context->buffer);
 		context->bitcount += SHA256_BLOCK_LENGTH << 3;
 		len -= SHA256_BLOCK_LENGTH;
 		data += SHA256_BLOCK_LENGTH;
@@ -880,7 +881,8 @@
 	}
 	while (len >= SHA512_BLOCK_LENGTH) {
 		/* Process as many complete blocks as we can */
-		SHA512_Transform(context, (sha2_word64*)data);
+		MEMCPY_BCOPY(context->buffer, data, SHA512_BLOCK_LENGTH);
+		SHA512_Transform(context, (sha2_word64*)context->buffer);
 		ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
 		len -= SHA512_BLOCK_LENGTH;
 		data += SHA512_BLOCK_LENGTH;
Index: test/digest/test_digest.rb
===================================================================
--- test/digest/test_digest.rb	(revision 32545)
+++ test/digest/test_digest.rb	(revision 32546)
@@ -78,6 +78,15 @@
     }
   end
 
+  def test_alignment
+    md = self.class::ALGO.new
+    assert_nothing_raised('#4320') {
+      md.update('a' * 97)
+      md.update('a' * 97)
+      md.hexdigest
+    }
+  end
+
   class TestMD5 < Test::Unit::TestCase
     include TestDigest
     ALGO = Digest::MD5

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]