Skip to content

Fix RestrictedEvalProvider to retain state and print#686

Open
datvo06 wants to merge 1 commit into
masterfrom
dn-fix-685-restricted-eval
Open

Fix RestrictedEvalProvider to retain state and print#686
datvo06 wants to merge 1 commit into
masterfrom
dn-fix-685-restricted-eval

Conversation

@datvo06

@datvo06 datvo06 commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Close #685

Closes #685.

Two defects in `RestrictedEvalProvider.exec`, fine for single-shot
synthesis decoding but breaking any caller that reuses the namespace
across calls (e.g. a persistent REPL):

- Rebinding a name already in the namespace was silently dropped:
  `keys_before` was snapshotted after `rglobals.update(env)`, so the
  copy-back only saw never-before-present keys.  Replace with an
  identity diff that copies back every binding effect — new names and
  rebindings of seeded names alike.
- `print(...)` raised `NameError: '_print_'`: RestrictedPython rewrites
  print into its `_print_` collector protocol, which the provider never
  supplied.  Add `_StdoutPrintCollector`, a `_print_` factory routing
  output to the real `sys.stdout` so output-capturing callers see it.

The `exec` op's contract — after `exec(bytecode, env)`, `env` reflects
all top-level binding effects — now holds under both providers.

Backward-compatible with the synthesis decode caller (its dict is read
once and discarded).
@datvo06 datvo06 requested a review from eb8680 June 11, 2026 21:19
@datvo06 datvo06 marked this pull request as ready for review June 11, 2026 21:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RestrictedEvalProvider.exec drops rebindings of seeded names and does not wire RestrictedPython's print protocol

1 participant