From 69d748a95e917fd12f4183eb9b0d9b0304fbfcfa Mon Sep 17 00:00:00 2001 From: Stephen Chang Date: Fri, 26 Jul 2019 12:59:20 -0400 Subject: [PATCH] fix seg fault when using in-X-set sequence constructor with wrong kind of set; closes #2765 --- pkgs/racket-test-core/tests/racket/for.rktl | 12 ++++++++++++ racket/collects/racket/private/set-types.rkt | 13 ++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/for.rktl b/pkgs/racket-test-core/tests/racket/for.rktl index d32578359c..5f293e5682 100644 --- a/pkgs/racket-test-core/tests/racket/for.rktl +++ b/pkgs/racket-test-core/tests/racket/for.rktl @@ -776,6 +776,18 @@ (err/rt-test (for/sum ([x (in-weak-set '(1 2))]) x) exn:fail:contract? #rx"not a hash set") +(err/rt-test (for/sum ([x (in-weak-set (set 1 2))]) x) + exn:fail:contract? + #rx"wrong kind of hash set") +(err/rt-test (for/sum ([x (in-mutable-set (set 1 2))]) x) + exn:fail:contract? + #rx"wrong kind of hash set") +(err/rt-test (for/sum ([x (in-immutable-set (mutable-set 1 2))]) x) + exn:fail:contract? + #rx"wrong kind of hash set") +(err/rt-test (for/sum ([x (in-immutable-set (weak-set 1 2))]) x) + exn:fail:contract? + #rx"wrong kind of hash set") (test 10 'in-hash-set (for/sum ([x (in-immutable-set (set 1 2 3 4))]) x)) (test 10 'in-hash-set (for/sum ([x (in-mutable-set (mutable-set 1 2 3 4))]) x)) (test 10 'in-hash-set (for/sum ([x (in-weak-set (weak-set 1 2 3 4))]) x)) diff --git a/racket/collects/racket/private/set-types.rkt b/racket/collects/racket/private/set-types.rkt index 90aef823db..0c568de02e 100644 --- a/racket/collects/racket/private/set-types.rkt +++ b/racket/collects/racket/private/set-types.rkt @@ -611,7 +611,7 @@ (:do-in ;;outer bindings ([(HT fn) (let ([xs set-expr]) - (if (custom-set? xs) + (if (and (custom-set? xs) (-test? xs)) (values (custom-set-table xs) (if (custom-set-spec xs) @@ -619,8 +619,15 @@ (lambda (x) x))) (values #f #f)))]) ;; outer check - (unless (and HT (-test? HT)) - (custom-in-set/checked set-expr)) + (unless HT + (define s set-expr) + (if (custom-set? s) + (raise (exn:fail:contract + (format "wrong kind of hash set, expected ~a, got: ~a\n" 'SETTYPE s) + (current-continuation-marks))) + (raise (exn:fail:contract + (format "not a hash set: ~a" s) + (current-continuation-marks))))) ;; loop bindings ([i (-first HT)]) ;; pos check