Skip to content

Commit 88e7cc5

Browse files
committed
[GR-13272] Introduce prefix for opaque filesystem.
PullRequest: graalpython/383
2 parents fae2363 + 61b9201 commit 88e7cc5

File tree

4 files changed

+39
-13
lines changed

4 files changed

+39
-13
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ public PythonModule initializeSysModule() {
450450
sys.setAttribute("graal_python_core_home", PythonOptions.getOption(context, PythonOptions.CoreHome));
451451
sys.setAttribute("graal_python_stdlib_home", PythonOptions.getOption(context, PythonOptions.StdLibHome));
452452
sys.setAttribute("graal_python_opaque_filesystem", PythonOptions.getOption(context, PythonOptions.OpaqueFilesystem));
453+
sys.setAttribute("graal_python_opaque_filesystem_prefix", PythonOptions.getOption(context, PythonOptions.OpaqueFilesystemPrefixes));
453454
sys.setAttribute("__flags__", factory().createTuple(new Object[]{
454455
false, // bytes_warning
455456
!PythonOptions.getFlag(context, PythonOptions.PythonOptimizeFlag), // debug

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,12 @@
4747
import java.nio.channels.SeekableByteChannel;
4848
import java.nio.channels.WritableByteChannel;
4949
import java.nio.charset.StandardCharsets;
50+
import java.nio.file.AccessDeniedException;
51+
import java.nio.file.FileAlreadyExistsException;
52+
import java.nio.file.FileSystemException;
5053
import java.nio.file.InvalidPathException;
5154
import java.nio.file.LinkOption;
55+
import java.nio.file.NoSuchFileException;
5256
import java.nio.file.StandardCopyOption;
5357
import java.nio.file.StandardOpenOption;
5458
import java.nio.file.attribute.FileAttribute;
@@ -59,6 +63,7 @@
5963
import java.nio.file.attribute.UserPrincipal;
6064
import java.util.Arrays;
6165
import java.util.Collection;
66+
import java.util.HashMap;
6267
import java.util.HashSet;
6368
import java.util.List;
6469
import java.util.Random;
@@ -126,11 +131,6 @@
126131
import com.oracle.truffle.api.profiles.ValueProfile;
127132
import com.sun.security.auth.UnixNumericGroupPrincipal;
128133
import com.sun.security.auth.UnixNumericUserPrincipal;
129-
import java.nio.file.AccessDeniedException;
130-
import java.nio.file.FileAlreadyExistsException;
131-
import java.nio.file.FileSystemException;
132-
import java.nio.file.NoSuchFileException;
133-
import java.util.HashMap;
134134

135135
@CoreFunctions(defineModule = "posix")
136136
public class PosixModuleBuiltins extends PythonBuiltins {
@@ -1074,25 +1074,29 @@ public static ReadFromChannelNode create() {
10741074
public abstract static class ReadNode extends PythonFileNode {
10751075
private static final int MAX_READ = Integer.MAX_VALUE / 2;
10761076

1077+
@CompilationFinal private BranchProfile tooLargeProfile = BranchProfile.create();
1078+
10771079
@Specialization(guards = "readOpaque(frame)")
1078-
Object readOpaque(@SuppressWarnings("unused") VirtualFrame frame, int fd, @SuppressWarnings("unused") Object requestedSize,
1080+
Object readOpaque(@SuppressWarnings("unused") VirtualFrame frame, int fd, long requestedSize,
10791081
@Cached("createClassProfile()") ValueProfile channelClassProfile,
10801082
@Cached("create()") ReadFromChannelNode readNode) {
1081-
Channel channel = getResources().getFileChannel(fd, channelClassProfile);
1082-
ByteSequenceStorage bytes = readNode.execute(channel, MAX_READ);
1083-
return new OpaqueBytes(Arrays.copyOf(bytes.getInternalByteArray(), bytes.length()));
1083+
if (OpaqueBytes.isInOpaqueFilesystem(getResources().getFilePath(fd), getContext())) {
1084+
Channel channel = getResources().getFileChannel(fd, channelClassProfile);
1085+
ByteSequenceStorage bytes = readNode.execute(channel, MAX_READ);
1086+
return new OpaqueBytes(Arrays.copyOf(bytes.getInternalByteArray(), bytes.length()));
1087+
}
1088+
return read(frame, fd, requestedSize, channelClassProfile, readNode);
10841089
}
10851090

10861091
@Specialization(guards = "!readOpaque(frame)")
10871092
Object read(@SuppressWarnings("unused") VirtualFrame frame, int fd, long requestedSize,
10881093
@Cached("createClassProfile()") ValueProfile channelClassProfile,
1089-
@Cached("create()") BranchProfile tooLarge,
10901094
@Cached("create()") ReadFromChannelNode readNode) {
10911095
int size;
10921096
try {
10931097
size = Math.toIntExact(requestedSize);
10941098
} catch (ArithmeticException e) {
1095-
tooLarge.enter();
1099+
tooLargeProfile.enter();
10961100
size = MAX_READ;
10971101
}
10981102
Channel channel = getResources().getFileChannel(fd, channelClassProfile);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/OpaqueBytes.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -40,10 +40,15 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.bytes;
4242

43+
import java.nio.file.Path;
44+
import java.nio.file.Paths;
45+
46+
import com.oracle.graal.python.builtins.Python3Core;
4347
import com.oracle.graal.python.runtime.PythonContext;
4448
import com.oracle.graal.python.runtime.PythonOptions;
4549
import com.oracle.truffle.api.Assumption;
4650
import com.oracle.truffle.api.CompilerDirectives;
51+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4752
import com.oracle.truffle.api.Truffle;
4853
import com.oracle.truffle.api.interop.CanResolve;
4954
import com.oracle.truffle.api.interop.ForeignAccess;
@@ -90,6 +95,19 @@ private static Boolean checkOption(PythonContext context) {
9095
return PythonOptions.getOption(context, PythonOptions.OpaqueFilesystem);
9196
}
9297

98+
@TruffleBoundary
99+
public static boolean isInOpaqueFilesystem(String path, PythonContext context) {
100+
Path filePath = Paths.get(path);
101+
String prefixStr = PythonOptions.getOption(context, PythonOptions.OpaqueFilesystemPrefixes);
102+
String[] prefixes = prefixStr.split(Python3Core.PATH_SEPARATOR);
103+
for (int i = 0; i < prefixes.length; i++) {
104+
if (filePath.startsWith(Paths.get(prefixes[i]))) {
105+
return true;
106+
}
107+
}
108+
return false;
109+
}
110+
93111
public static void initializeForNewContext(PythonContext context) {
94112
CompilerDirectives.transferToInterpreter();
95113
if (checkOption(context)) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
*/
2626
package com.oracle.graal.python.runtime;
2727

28-
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
2928
import org.graalvm.options.OptionCategory;
3029
import org.graalvm.options.OptionDescriptors;
3130
import org.graalvm.options.OptionKey;
3231

3332
import com.oracle.graal.python.PythonLanguage;
33+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
3434
import com.oracle.truffle.api.Option;
3535

3636
@Option.Group(PythonLanguage.ID)
@@ -54,6 +54,9 @@ private PythonOptions() {
5454
"but all other access to the contents of the file is disabled, so the files are kept secret.") //
5555
public static final OptionKey<Boolean> OpaqueFilesystem = new OptionKey<>(false);
5656

57+
@Option(category = OptionCategory.USER, help = "List of root paths for the opaque file system (default: '/'); use system-specific path separator.") //
58+
public static final OptionKey<String> OpaqueFilesystemPrefixes = new OptionKey<>("/");
59+
5760
@Option(category = OptionCategory.USER, help = "Equivalent to the Python -i flag. Inspect interactively after running a script.") //
5861
public static final OptionKey<Boolean> InspectFlag = new OptionKey<>(false);
5962

0 commit comments

Comments
 (0)