Skip to content

Commit e8dcb2d

Browse files
committed
[GR-12774] Disable eval of internal sources through polyglot api
PullRequest: graalpython/305
2 parents 93a2109 + 6a30693 commit e8dcb2d

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_interop.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,11 @@ def test_host_lookup():
250250
assert True
251251
else:
252252
assert False, "requesting a non-existing host symbol should raise KeyError"
253+
254+
def test_internal_languages_dont_eval():
255+
try:
256+
polyglot.eval(language="nfi", string="default")
257+
except NotImplementedError as e:
258+
assert "internal language" in str(e)
259+
260+
assert polyglot.eval(language="python", string="21 * 2") == 42

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/InteropModuleBuiltins.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ Object evalString(@SuppressWarnings("unused") PNone path, String value, String l
130130
try {
131131
boolean mimeType = isMimeType(langOrMimeType);
132132
String lang = mimeType ? findLanguageByMimeType(env, langOrMimeType) : langOrMimeType;
133+
raiseIfInternal(env, lang);
133134
LiteralBuilder newBuilder = Source.newBuilder(lang, value, value);
134135
if (mimeType) {
135136
newBuilder = newBuilder.mimeType(langOrMimeType);
@@ -140,13 +141,21 @@ Object evalString(@SuppressWarnings("unused") PNone path, String value, String l
140141
}
141142
}
142143

144+
private void raiseIfInternal(Env env, String lang) {
145+
LanguageInfo languageInfo = env.getLanguages().get(lang);
146+
if (languageInfo != null && languageInfo.isInternal()) {
147+
throw raise(NotImplementedError, "access to internal language %s is not permitted", lang);
148+
}
149+
}
150+
143151
@TruffleBoundary
144152
@Specialization
145153
Object evalFile(String path, @SuppressWarnings("unused") PNone string, String langOrMimeType) {
146154
Env env = getContext().getEnv();
147155
try {
148156
boolean mimeType = isMimeType(langOrMimeType);
149157
String lang = mimeType ? findLanguageByMimeType(env, langOrMimeType) : langOrMimeType;
158+
raiseIfInternal(env, lang);
150159
SourceBuilder newBuilder = Source.newBuilder(lang, env.getTruffleFile(path));
151160
if (mimeType) {
152161
newBuilder = newBuilder.mimeType(langOrMimeType);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SREModuleBuiltins.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
import com.oracle.truffle.api.interop.UnsupportedTypeException;
8181
import com.oracle.truffle.api.nodes.Node;
8282
import com.oracle.truffle.api.profiles.BranchProfile;
83+
import com.oracle.truffle.api.source.Source;
8384
import com.oracle.truffle.regex.RegexSyntaxException;
8485

8586
@CoreFunctions(defineModule = "_sre")
@@ -89,6 +90,16 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8990
return SREModuleBuiltinsFactory.getFactories();
9091
}
9192

93+
@Builtin(name = "_build_regex_engine", fixedNumOfPositionalArgs = 1)
94+
@GenerateNodeFactory
95+
abstract static class BuildRegexEngine extends PythonUnaryBuiltinNode {
96+
@Specialization
97+
@TruffleBoundary
98+
Object run(String code) {
99+
return getContext().getEnv().parse(Source.newBuilder("regex", code, "build-regex-engine").build()).call();
100+
}
101+
}
102+
92103
/**
93104
* Replaces any <it>quoted</it> escape sequence like {@code "\\n"} (two characters; backslash +
94105
* 'n') by its single character like {@code "\n"} (one character; newline).

graalpython/lib-graalpython/_sre.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def executable_pattern(regex_object, input, from_index):
9999

100100
return fallback_compiler
101101

102-
engine_builder = _interop.eval(string="", language="regex")
102+
engine_builder = _build_regex_engine("")
103103

104104
global TREGEX_ENGINE_STR
105105
global TREGEX_ENGINE_BYTES

0 commit comments

Comments
 (0)