From efa9a1e920c3e961fd3731c0d84aabf4812c1fa9 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 9 Jul 2014 15:13:33 +0100 Subject: [PATCH] fix protected-export checking in `dynamic-require` The `dynamic-require` funciton was not checking correctly for re-exported bindings. --- .../racket-test/tests/racket/modprot.rktl | 19 ++++++++++++++ racket/src/racket/src/module.c | 25 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/modprot.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/modprot.rktl index 16440d455e..0989c31a8b 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/modprot.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/modprot.rktl @@ -345,6 +345,25 @@ three/normal current-code-inspector make-inspector #t #t #t #t #f) +;; ---------------------------------------- + +(err/rt-test (parameterize ([current-code-inspector (make-inspector (current-code-inspector))]) + (dynamic-require 'racket/unsafe/ops 'unsafe-s16vector-ref))) + +(err/rt-test (parameterize ([current-code-inspector (make-inspector (current-code-inspector))]) + (eval '(define-syntax foo (dynamic-require 'racket/unsafe/ops 'unsafe-s16vector-ref))))) + +(let ([n (make-base-namespace)]) + (eval '(module m racket/base + (require (for-syntax racket/unsafe/ops)) + (provide (for-syntax unsafe-s16vector-ref)))) + (parameterize ([current-code-inspector (make-inspector (current-code-inspector))]) + (err/rt-test + (eval '(module n racket/base + (require (for-syntax racket/base) 'm) + (begin-for-syntax unsafe-s16vector-ref))) + exn:fail:syntax?))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/module.c b/racket/src/racket/src/module.c index 15b355dec6..9f2f85c0d5 100644 --- a/racket/src/racket/src/module.c +++ b/racket/src/racket/src/module.c @@ -1137,7 +1137,7 @@ static Scheme_Object *_dynamic_require(int argc, Scheme_Object *argv[], Scheme_Object *name, *srcname, *srcmname, *fail_thunk; Scheme_Module *m, *srcm; Scheme_Env *menv, *lookup_env = NULL; - int i, count, protected = 0; + int i, count, protected = 0, check_protected_at_source = 0; const char *errname; intptr_t base_phase; @@ -1320,6 +1320,7 @@ static Scheme_Object *_dynamic_require(int argc, Scheme_Object *argv[], else { srcmname = scheme_modidx_shift(srcmname, srcm->me->src_modidx, srcm->self_modidx); srcmname = scheme_module_resolve(srcmname, 1); + check_protected_at_source = 1; } srcname = srcm->me->rt->provide_src_names[i]; } @@ -1388,6 +1389,28 @@ static Scheme_Object *_dynamic_require(int argc, Scheme_Object *argv[], menv = scheme_module_access(srcmname, lookup_env ? lookup_env : env, mod_phase); + if (check_protected_at_source) { + Scheme_Module_Phase_Exports *pt; + if (mod_phase == 0) + pt = menv->module->me->rt; + else if (mod_phase == 1) + pt = menv->module->me->et; + else if (menv->module->me->other_phases) + pt = (Scheme_Module_Phase_Exports *)scheme_hash_get(menv->module->me->other_phases, + scheme_make_integer(mod_phase)); + else + pt = NULL; + if (pt) { + count = pt->num_provides; + for (i = 0; i < count; i++) { + if (SAME_OBJ(name, pt->provides[i])) { + if (menv->module->exp_infos[mod_phase]->provide_protects) + protected = menv->module->exp_infos[mod_phase]->provide_protects[i]; + } + } + } + } + if (protected) { Scheme_Object *insp; insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR);