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/