~ chicken-core (chicken-5) 6edccb4bd5dfbedce6497cae8eae35b2279f8fa8


commit 6edccb4bd5dfbedce6497cae8eae35b2279f8fa8
Author:     Florian Zumbiehl <florz@florz.de>
AuthorDate: Thu Mar 14 05:43:46 2013 +0100
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Thu Jun 6 21:14:10 2013 +0200

    alist-update: don't segfault on non-list
    
    Check the alist passed to alist-update is actually a pair before
    using ##sys#slot on it.
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/data-structures.scm b/data-structures.scm
index 54089249..1ac46e2b 100644
--- a/data-structures.scm
+++ b/data-structures.scm
@@ -218,16 +218,19 @@
 
 (define (alist-update k v lst #!optional (cmp eqv?))
   (let loop ((lst lst))
-    (if (null? lst)
-        (list (cons k v))
-        (let ((a (##sys#slot lst 0)))
-          (cond ((not (pair? a))
-                 (error 'alist-update "bad argument type" a))
-                ((cmp (##sys#slot a 0) k)
-                 (cons (cons k v) (##sys#slot lst 1)))
-                (else
-                 (cons (cons (##sys#slot a 0) (##sys#slot a 1))
-                       (loop (##sys#slot lst 1)))))))))
+    (cond ((null? lst)
+           (list (cons k v)))
+          ((not (pair? lst))
+           (error 'alist-update "bad argument type" lst))
+          (else
+           (let ((a (##sys#slot lst 0)))
+             (cond ((not (pair? a))
+                    (error 'alist-update "bad argument type" a))
+                   ((cmp (##sys#slot a 0) k)
+                    (cons (cons k v) (##sys#slot lst 1)))
+                   (else
+                    (cons (cons (##sys#slot a 0) (##sys#slot a 1))
+                          (loop (##sys#slot lst 1))))))))))
 
 (define (alist-ref x lst #!optional (cmp eqv?) (default #f))
   (let* ([aq (cond [(eq? eq? cmp) assq]
Trap