#531 closed defect (fixed)
"Snowdigest" egg causes stack overflow error in tests with experimental
Reported by: | sjamaan | Owned by: | felix winkelmann |
---|---|---|---|
Priority: | critical | Milestone: | 4.9.0 |
Component: | core libraries | Version: | 4.6.x |
Keywords: | stack overflow | Cc: | |
Estimated difficulty: |
Description
$ /home/sjamaan/chicken-test/bin/csi -s run.scm 00000000 e8b7be43 352441c2 4c2750bd 1fc2e6d2 7ca94a72 d41d8cd98f00b204e9800998ecf8427e 0cc175b9c0f1b6a831c399e269772661 900150983cd24fb0d6963f7d28e17f72 Error: stack overflow Call history: <eval> [t] (print md) <eval> [t] (string-ci=? md expect) <eval> [t] (car v) <eval> [t] (cadr v) <eval> [t] (caddr v) <eval> [t] (cadddr v) <eval> [t] (= repeat 0) <eval> [t] (digest-string str2 algorithm (quote hex)) <eval> [t] (print md) <eval> [t] (string-ci=? md expect) <eval> [t] (car v) <eval> [t] (cadr v) <eval> [t] (caddr v) <eval> [t] (cadddr v) <eval> [t] (= repeat 0) <eval> [t] (digest-string str2 algorithm (quote hex)) <--
This happened on NetBSD/amd64 with experimental (4.6.6). Doesn't happen under 4.6.0
I tagged it as a "core libraries" error, since I assume it's a bug in Chicken, not snowdigest.
Note: See
TracTickets for help on using
tickets.
The problem appears to be that the internal calculation-routines in snowdigest are optimized into non-CPS "direct" calls (this code is very tight and does lots of fixnum-arithmetic). It is also recursive, so, depending on initial stack size, it may happen that the recursive direct-style part is running while the stack is already relatively near to the limit (i.e. shortly before CPS-code would trigger a minor GC). I have raised the size of the "reserve" area on the stack for this situation (it was 4096 bytes before, now it's 64k).
There also was a problem with garbage bits in character values for which the internal comparison routines didn't work correctly.
See "experimental" branch for the fix. The char-comparison change will only propagate by compiling the compiler with itself and then rebuilding.