Ticket #818: 0001-Ensure-outside-hash-functions-do-not-leak-into-srfi-.patch.txt

File 0001-Ensure-outside-hash-functions-do-not-leak-into-srfi-.patch.txt, 3.0 KB (added by Jim Ursetto, 12 years ago)
Line 
1From 9f2f2cb6290831460060810b7b49a0ba72073a46 Mon Sep 17 00:00:00 2001
2From: Jim Ursetto <zbigniewsz@gmail.com>
3Date: Wed, 18 Apr 2012 18:28:11 -0500
4Subject: [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
11diff --git a/srfi-69.scm b/srfi-69.scm
12index 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--
791.7.6.1
80