| 1 | From 9f2f2cb6290831460060810b7b49a0ba72073a46 Mon Sep 17 00:00:00 2001
|
|---|
| 2 | From: Jim Ursetto <zbigniewsz@gmail.com>
|
|---|
| 3 | Date: Wed, 18 Apr 2012 18:28:11 -0500
|
|---|
| 4 | Subject: [PATCH] Ensure outside hash functions do not leak into srfi-69
|
|---|
| 5 | (fixes #818)
|
|---|
| 6 |
|
|---|
| 7 | ---
|
|---|
| 8 | srfi-69.scm | 49 ++++++++++++++++++++++++++++---------------------
|
|---|
| 9 | 1 files changed, 28 insertions(+), 21 deletions(-)
|
|---|
| 10 |
|
|---|
| 11 | diff --git a/srfi-69.scm b/srfi-69.scm
|
|---|
| 12 | index 99025a2..122e8cd 100644
|
|---|
| 13 | --- a/srfi-69.scm
|
|---|
| 14 | +++ b/srfi-69.scm
|
|---|
| 15 | @@ -410,26 +410,30 @@
|
|---|
| 16 | cur
|
|---|
| 17 | (loop nxt) ) ) ) )
|
|---|
| 18 |
|
|---|
| 19 | -(define (*make-hash-function user-function)
|
|---|
| 20 | - (if (memq user-function (list eq?-hash eqv?-hash equal?-hash hash
|
|---|
| 21 | - string-hash string-hash-ci number-hash))
|
|---|
| 22 | - ;; Don't add unneccessary bounds checks for procedures known to be
|
|---|
| 23 | - ;; well-behaved (these are not user-*created* functions)
|
|---|
| 24 | - (let ((randomization (##core#inline "C_rnd_fix")))
|
|---|
| 25 | - (if (memq user-function (list string-hash string-hash-ci))
|
|---|
| 26 | - ;; String functions have differing signatures; treat them specially
|
|---|
| 27 | - (lambda (object bound)
|
|---|
| 28 | - (user-function object bound #f #f randomization))
|
|---|
| 29 | - (lambda (object bound)
|
|---|
| 30 | - (user-function object bound randomization))))
|
|---|
| 31 | - (lambda (object bound)
|
|---|
| 32 | - (let ((hash (user-function object bound)))
|
|---|
| 33 | - (##sys#check-exact hash 'hash user-function)
|
|---|
| 34 | - (if (and (fx< hash bound) (fx>= hash 0))
|
|---|
| 35 | - hash
|
|---|
| 36 | - (##sys#signal-hook
|
|---|
| 37 | - #:bounds-error 'hash
|
|---|
| 38 | - "Hash value out of bounds" bound hash user-function) )))))
|
|---|
| 39 | +(define *make-hash-function
|
|---|
| 40 | + (let ((eq?-hash eq?-hash) (eqv?-hash eqv?-hash) (equal?-hash equal?-hash)
|
|---|
| 41 | + (hash hash) (string-hash string-hash) (string-hash-ci string-hash-ci)
|
|---|
| 42 | + (number-hash number-hash))
|
|---|
| 43 | + (lambda (user-function)
|
|---|
| 44 | + (if (memq user-function (list eq?-hash eqv?-hash equal?-hash hash
|
|---|
| 45 | + string-hash string-hash-ci number-hash))
|
|---|
| 46 | + ;; Don't add unnecessary bounds checks for procedures known to be
|
|---|
| 47 | + ;; well-behaved (these are not user-*created* functions)
|
|---|
| 48 | + (let ((randomization (##core#inline "C_rnd_fix")))
|
|---|
| 49 | + (if (memq user-function (list string-hash string-hash-ci))
|
|---|
| 50 | + ;; String functions have differing signatures; treat them specially
|
|---|
| 51 | + (lambda (object bound)
|
|---|
| 52 | + (user-function object bound #f #f randomization))
|
|---|
| 53 | + (lambda (object bound)
|
|---|
| 54 | + (user-function object bound randomization))))
|
|---|
| 55 | + (lambda (object bound)
|
|---|
| 56 | + (let ((hash (user-function object bound)))
|
|---|
| 57 | + (##sys#check-exact hash 'hash user-function)
|
|---|
| 58 | + (if (and (fx< hash bound) (fx>= hash 0))
|
|---|
| 59 | + hash
|
|---|
| 60 | + (##sys#signal-hook
|
|---|
| 61 | + #:bounds-error 'hash
|
|---|
| 62 | + "Hash value out of bounds" bound hash user-function) )))))))
|
|---|
| 63 |
|
|---|
| 64 | ;; "Raw" make-hash-table:
|
|---|
| 65 |
|
|---|
| 66 | @@ -462,7 +466,10 @@
|
|---|
| 67 | [core-equal? equal?]
|
|---|
| 68 | [core-string=? string=?]
|
|---|
| 69 | [core-string-ci=? string-ci=?]
|
|---|
| 70 | - [core= =] )
|
|---|
| 71 | + [core= =]
|
|---|
| 72 | + (eq?-hash eq?-hash) (eqv?-hash eqv?-hash) (equal?-hash equal?-hash)
|
|---|
| 73 | + (hash hash) (string-hash string-hash) (string-hash-ci string-hash-ci)
|
|---|
| 74 | + (number-hash number-hash))
|
|---|
| 75 | (lambda arguments0
|
|---|
| 76 | (let ([arguments arguments0]
|
|---|
| 77 | [test equal?]
|
|---|
| 78 | --
|
|---|
| 79 | 1.7.6.1
|
|---|
| 80 |
|
|---|