ruby-changes:20499
From: nahi <ko1@a...>
Date: Fri, 15 Jul 2011 12:05:33 +0900 (JST)
Subject: [ruby-changes:20499] nahi:r32547 (ruby_1_9_3): * backport r32546 from trunk.
nahi 2011-07-15 12:05:23 +0900 (Fri, 15 Jul 2011) New Revision: 32547 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32547 Log: * backport r32546 from trunk. * 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: branches/ruby_1_9_3/ChangeLog branches/ruby_1_9_3/ext/digest/sha2/sha2.c branches/ruby_1_9_3/test/digest/test_digest.rb Index: ruby_1_9_3/ChangeLog =================================================================== --- ruby_1_9_3/ChangeLog (revision 32546) +++ ruby_1_9_3/ChangeLog (revision 32547) @@ -1,3 +1,16 @@ +Fri Jul 15 09:59:12 2011 Hiroshi Nakamura <nahi@r...> + + * backport r32546 from trunk. + + * 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. + + Thu Jul 14 12:40:07 2011 Hiroshi Nakamura <nahi@r...> * backport r32537 from trunk. Index: ruby_1_9_3/ext/digest/sha2/sha2.c =================================================================== --- ruby_1_9_3/ext/digest/sha2/sha2.c (revision 32546) +++ ruby_1_9_3/ext/digest/sha2/sha2.c (revision 32547) @@ -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: ruby_1_9_3/test/digest/test_digest.rb =================================================================== --- ruby_1_9_3/test/digest/test_digest.rb (revision 32546) +++ ruby_1_9_3/test/digest/test_digest.rb (revision 32547) @@ -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/