Issue #4320 has been updated by Nils Goroll.

File ruby_issue_4320__digest_sha2_alignment.patch added

I'll attach a proposed fix:

* make ((|context->buffer|)) an array of the type being expected by (({SHAXXX_Transform})) (rather than a byte array), so our compiler will align it, if necessary
* remove now unneeded casts when passing the buffer to (({SHAXXX_Transform}))
* use a cast-to-uint8 version of the buffer for byte access

the actual fix:

* for platforms which are not known to accept unaligned access to words (conditions taken from ((%regint.h%))), use existing buffering code in (({SHAXXX_Update})) to align data by copying

I am not too happy about the (({PLAT_NEED_ALIGNED_WORD_ACCESS})), it appears to me that checking architecture alignment requirements should be done in ((%autoconf%)) or similar. Also, the simplistic (({ALIGNOF()})) macro will not return the minimal alignment requirement, but rather the alignment the compiler has chosen for a struct (which may be more than minimal).

At any rate, the patch does the job.

=== Test

I've done basic regression testing by

* comparing the output of the following commands between x86 with unpatched 1.8.7-p175 i386-solaris2.11 and patched 1.9.2-p180:

 ruby -e "require 'digest/sha2'; 1.upto(2*90+20) { |i| 1.upto(2*90+20) { |j| d= Digest::SHA256.new; p i.to_s+' '+j.to_s; ['a' * i, 'b' * j].each {|c| d.update(c)}; p d}}" >/tmp/sha_256.out &
 ruby -e "require 'digest/sha2'; 1.upto(2*90+20) { |i| 1.upto(2*90+20) { |j| d= Digest::SHA512.new; p i.to_s+' '+j.to_s; ['a' * i, 'b' * j].each {|c| d.update(c)}; p d}}" >/tmp/sha_512.out &

* checksumming the contents of Solaris 10 SPARC ((%/usr/bin%)) with the vesions given above usind:

 find . -type f | ruby -e "require 'digest/sha2'; ARGF.each_line { |fname| fname = fname.chomp; begin; p fname+': '+Digest::SHA256.file(fname).hexdigest; rescue; end; } " >/tmp/ruby_hash_n

So I presume SHA2 is working OK.

((%make check%)) returns

 8063 tests, 1870484 assertions, 21 failures, 35 errors, 2 skips

but none of the failures/errors is related to digest.
----------------------------------------
Bug #4320: Bus Error in digest/sha2 on sparc
http://redmine.ruby-lang.org/issues/4320

Author: Meik Nienaber
Status: Assigned
Priority: Normal
Assignee: Akinori MUSHA
Category: 
Target version: 1.9.2
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [sparc-solaris2.10]


 Most likely this is caused due to misaligned memory. Any comment is greatly appreciated.
 
 This bug can reproduce at Ruby 1.8, too.
 
 ruby -e "require 'digest/sha2'; d= Digest::SHA256.new; ['a' * 97, 'a' * 97].each {|i| d.update(i)}; p d"
 -e:1: [BUG] Bus Error
 ruby 1.9.2p136 (2010-12-25 revision 30365) [sparc-solaris2.10]
 
 -- control frame ----------
 c:0007 p:---- s:0019 b:0019 l:000018 d:000018 CFUNC  :update
 c:0006 p:0014 s:0015 b:0015 l:0015ac d:000014 BLOCK  -e:1
 c:0005 p:---- s:0012 b:0012 l:000011 d:000011 FINISH
 c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC  :each
 c:0003 p:0054 s:0007 b:0007 l:0015ac d:000ed0 EVAL   -e:1
 c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
 c:0001 p:0000 s:0002 b:0002 l:0015ac d:0015ac TOP


-- 
http://redmine.ruby-lang.org