diff --git a/pkgs/racket-test-core/tests/racket/place.rktl b/pkgs/racket-test-core/tests/racket/place.rktl index 304832b909..639a36cb65 100644 --- a/pkgs/racket-test-core/tests/racket/place.rktl +++ b/pkgs/racket-test-core/tests/racket/place.rktl @@ -106,6 +106,20 @@ (test (not (place-enabled?)) place-message-allowed? (cons v 1)) (test (not (place-enabled?)) place-message-allowed? (vector v))) +(let () + (struct s (a) #:prefab) + (struct p (x)) + (define c (chaperone-struct (p 1) + p-x + (lambda (s v) v))) + (test (not (place-enabled?)) place-message-allowed? (s (lambda () 1))) + (test (not (place-enabled?)) place-message-allowed? (s c)) + (test (not (place-enabled?)) place-message-allowed? (hasheq c 5)) + (test (not (place-enabled?)) place-message-allowed? (hasheq 5 c)) + (test (not (place-enabled?)) place-message-allowed? (vector c)) + (test (not (place-enabled?)) place-message-allowed? (cons c 6)) + (test (not (place-enabled?)) place-message-allowed? (cons 6 c))) + ;; ---------------------------------------- ;; Place messages and chaperones diff --git a/racket/src/racket/src/list.c b/racket/src/racket/src/list.c index 6d0a252fc3..49dfb77e9f 100644 --- a/racket/src/racket/src/list.c +++ b/racket/src/racket/src/list.c @@ -3676,7 +3676,12 @@ Scheme_Object *scheme_chaperone_hash_table_filtered_copy(Scheme_Object *obj, key = scheme_hash_table_iterate_key(2, a); val = scheme_chaperone_hash_get(obj, key); - if (filter && val) val = filter(val); + if (filter && val) { + key = filter(key); + if (!key) return NULL; + val = filter(val); + if (!val) return NULL; + } if (val) { a[0] = v2; a[1] = key; diff --git a/racket/src/racket/src/place.c b/racket/src/racket/src/place.c index d459dbb7ea..76b9ba27fc 100644 --- a/racket/src/racket/src/place.c +++ b/racket/src/racket/src/place.c @@ -1976,8 +1976,12 @@ static Scheme_Object *strip_chaperones(Scheme_Object *so) o = so; if (SCHEME_PAIRP(o)) { - return scheme_make_pair(strip_chaperones(SCHEME_CAR(o)), - strip_chaperones(SCHEME_CDR(o))); + Scheme_Object *a, *d; + a = strip_chaperones(SCHEME_CAR(o)); + if (!a) return NULL; + d = strip_chaperones(SCHEME_CDR(o)); + if (!d) return NULL; + return scheme_make_pair(a, d); } else if (SCHEME_VECTORP(o)) { Scheme_Object *v, *e; intptr_t len = SCHEME_VEC_SIZE(o), i; @@ -1988,6 +1992,7 @@ static Scheme_Object *strip_chaperones(Scheme_Object *so) else e = scheme_chaperone_vector_ref(so, i); e = strip_chaperones(e); + if (!e) return NULL; SCHEME_VEC_ELS(v)[i] = e; } return v; @@ -2006,6 +2011,7 @@ static Scheme_Object *strip_chaperones(Scheme_Object *so) else e = scheme_struct_ref(so, i); e = strip_chaperones(e); + if (!e) return NULL; s2->slots[i] = e; } return (Scheme_Object *)s2;