~ chicken-core (chicken-5) c948b4baf8a159fa9c033fcd3512dd8fd31c391d
commit c948b4baf8a159fa9c033fcd3512dd8fd31c391d
Author: Jim Ursetto <zbigniewsz@gmail.com>
AuthorDate: Wed Apr 18 18:28:11 2012 -0500
Commit: Peter Bex <peter.bex@xs4all.nl>
CommitDate: Thu Apr 19 09:42:52 2012 +0200
Ensure outside hash functions do not leak into srfi-69 (fixes #818)
Signed-off-by: Peter Bex <peter.bex@xs4all.nl>
diff --git a/srfi-69.scm b/srfi-69.scm
index 99025a21..122e8cdb 100644
--- a/srfi-69.scm
+++ b/srfi-69.scm
@@ -410,26 +410,30 @@
cur
(loop nxt) ) ) ) )
-(define (*make-hash-function user-function)
- (if (memq user-function (list eq?-hash eqv?-hash equal?-hash hash
- string-hash string-hash-ci number-hash))
- ;; Don't add unneccessary bounds checks for procedures known to be
- ;; well-behaved (these are not user-*created* functions)
- (let ((randomization (##core#inline "C_rnd_fix")))
- (if (memq user-function (list string-hash string-hash-ci))
- ;; String functions have differing signatures; treat them specially
- (lambda (object bound)
- (user-function object bound #f #f randomization))
- (lambda (object bound)
- (user-function object bound randomization))))
- (lambda (object bound)
- (let ((hash (user-function object bound)))
- (##sys#check-exact hash 'hash user-function)
- (if (and (fx< hash bound) (fx>= hash 0))
- hash
- (##sys#signal-hook
- #:bounds-error 'hash
- "Hash value out of bounds" bound hash user-function) )))))
+(define *make-hash-function
+ (let ((eq?-hash eq?-hash) (eqv?-hash eqv?-hash) (equal?-hash equal?-hash)
+ (hash hash) (string-hash string-hash) (string-hash-ci string-hash-ci)
+ (number-hash number-hash))
+ (lambda (user-function)
+ (if (memq user-function (list eq?-hash eqv?-hash equal?-hash hash
+ string-hash string-hash-ci number-hash))
+ ;; Don't add unnecessary bounds checks for procedures known to be
+ ;; well-behaved (these are not user-*created* functions)
+ (let ((randomization (##core#inline "C_rnd_fix")))
+ (if (memq user-function (list string-hash string-hash-ci))
+ ;; String functions have differing signatures; treat them specially
+ (lambda (object bound)
+ (user-function object bound #f #f randomization))
+ (lambda (object bound)
+ (user-function object bound randomization))))
+ (lambda (object bound)
+ (let ((hash (user-function object bound)))
+ (##sys#check-exact hash 'hash user-function)
+ (if (and (fx< hash bound) (fx>= hash 0))
+ hash
+ (##sys#signal-hook
+ #:bounds-error 'hash
+ "Hash value out of bounds" bound hash user-function) )))))))
;; "Raw" make-hash-table:
@@ -462,7 +466,10 @@
[core-equal? equal?]
[core-string=? string=?]
[core-string-ci=? string-ci=?]
- [core= =] )
+ [core= =]
+ (eq?-hash eq?-hash) (eqv?-hash eqv?-hash) (equal?-hash equal?-hash)
+ (hash hash) (string-hash string-hash) (string-hash-ci string-hash-ci)
+ (number-hash number-hash))
(lambda arguments0
(let ([arguments arguments0]
[test equal?]
Trap