Hi there,
when doing "make check" for a 2.3.0 build on Solaris Sparc I get a bus
error due to an alignment issue.
It seems the error is only happening during testing, because in the
official API it was fixed in
https://github.com/dovecot/core/commit/d8361cc8576d9ede93a037f9b96f2a3f9b7e9...
But the tests use hand written test vectors, that are not correctly aligned:
...
hash method md4 (test vectors) ....................................... : ok
hash method md5 (test vectors) ....................................... : ok
/bin/ksh[2]: 24287 Bus Error(coredump)
make[4]: *** [Makefile:2655: check-local] Error 1
gdb output:
Program terminated with signal SIGBUS, Bus error.
#0 sha1_loop (ctxt=0xffbff724, input=0x83908, len=3) at sha1.c:224
224 ctxt->c.b64[0] += copysiz * 8;
(gdb) print &ctxt->c.b64[0]
$1 = (uint64_t *) 0xffbff73c
So the address of the 8 byte type is not divisible by 8 (Sparc alignment
requirement).
Full stack:
(gdb) bt full
#0 sha1_loop (ctxt=0xffbff724, input=0x83908, len=3) at sha1.c:224
input_c = 0x83908 "abc"
gaplen = <optimized out>
gapstart = <optimized out>
off = 0
copysiz = 3
#1 0x00024eb0 in test_hash_methods_fips () at test-hash-method.c:338
n = 0
method = 0xc4e68
context = 0xffbff724 "gE#\001▒ͫ\211\230▒▒▒\020\062Tv▒▒▒▒"
result = "▒9▒▒^kK\r2U▒▒\225`\030\220▒▒\a\t"
i = 7
last_method = 0x839d0 "sha1"
test_vectors = {{method = 0x838e0 "md4", input = 0x838e8, ilen
= 0, rounds = 1, output = 0x838f0, olen = 16}, {method = 0x838e0 "md4",
input = 0x83908, ilen = 3,
rounds = 1, output = 0x83910, olen = 16}, {method = 0x838e0
"md4", input = 0x83928, ilen = 62, rounds = 1, output = 0x83968, olen =
16}, {method = 0x83980 "md5",
input = 0x838e8, ilen = 0, rounds = 1, output = 0x83988,
olen = 16}, {method = 0x83980 "md5", input = 0x83908, ilen = 3, rounds =
1, output = 0x839a0, olen = 16}, {
method = 0x83980 "md5", input = 0x83928, ilen = 62, rounds
= 1, output = 0x839b8, olen = 16}, {method = 0x839d0 "sha1", input =
0x838e8, ilen = 0, rounds = 1,
output = 0x839d8, olen = 20}, {method = 0x839d0 "sha1",
input = 0x83908, ilen = 3, rounds = 1, output = 0x839f0, olen = 20},
{method = 0x839d0 "sha1",
input = 0x83a08, ilen = 56, rounds = 1, output = 0x83a48,
olen = 20}, {method = 0x83a60 "sha3-256", input = 0x838e8, ilen = 0,
rounds = 1, output = 0x83a70,
olen = 32}, {method = 0x83a60 "sha3-256", input = 0x83a98,
ilen = 135, rounds = 1, output = 0x83b20, olen = 32}, {method = 0x83a60
"sha3-256", input = 0x83b48,
ilen = 200, rounds = 1, output = 0x83c18, olen = 32},
{method = 0x83a60 "sha3-256", input = 0x83c40, ilen = 1, rounds = 200,
output = 0x83c18, olen = 32}, {
method = 0x83c48 "sha3-512", input = 0x838e8, ilen = 0,
rounds = 1, output = 0x83c58, olen = 64}, {method = 0x83c48 "sha3-512",
input = 0x83a98, ilen = 135,
rounds = 1, output = 0x83ca0, olen = 64}, {method = 0x83c48
"sha3-512", input = 0x83b48, ilen = 200, rounds = 1, output = 0x83ce8,
olen = 64}, {
method = 0x83c48 "sha3-512", input = 0x83c40, ilen = 1,
rounds = 200, output = 0x83ce8, olen = 64}}
#2 0x0003e3e0 in test_run_named_funcs (tests=tests@entry=0x80434
, match=match@entry=0x7fd40 "") at test-common.c:255
_data_stack_cur_id = 2
i = <optimized out>
#3 0x0003f1e4 in test_run_named_with_fatals (match=0x7fd40 "",
tests=0x80434 , fatals=0x7fde8 ) at
test-common.c:337
No locals.
#4 0x0001e024 in _start ()
Unaligned data comes from file src/lib/test-hash-method.c:
...
53 static void test_hash_methods_fips() {
54 const char *last_method = NULL;
55
56 struct {
57 const char *method;
58 const void *input;
59 size_t ilen;
60 size_t rounds;
61 const void *output;
62 size_t olen;
63 } test_vectors[] =
64 {
...
115 { "sha1",
116 "",
117 0,
118 1,
119 "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d"
120 "\x32\x55\xbf\xef\x95\x60\x18\x90"
121 "\xaf\xd8\x07\x09",
122 160 / 8
123 },
...
etc.
The input data needs to be 8 byte aligned but is just a void *.
Thanks and regards,
Rainer