A DESCRIPTION OF THE PROBLEM :
UnixSecureDirectoryStream.PosixFileAttributeViewImpl.setPermissions is implemented by opening the target entry with openat and then using fchmod. But this unnecessarily limits the usage of setPermissions because it's possible that the entry can't be opened but its mode can be changed. Using fchmodat from the directory streams' dirfd would resolve this problem. (And also remove 2 syscalls.)
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
$ java PermissionTest.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
successful run of this program
ACTUAL -
Exception in thread "main" java.nio.file.AccessDeniedException: dir
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixSecureDirectoryStream$BasicFileAttributeViewImpl.open(UnixSecureDirectoryStream.java:310)
at java.base/sun.nio.fs.UnixSecureDirectoryStream$PosixFileAttributeViewImpl.setPermissions(UnixSecureDirectoryStream.java:431)
at PermissionTest.main(PermissionTest.java:18)
---------- BEGIN SOURCE ----------
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SecureDirectoryStream;
import java.nio.file.attribute.PosixFileAttributeView;
import java.nio.file.attribute.PosixFilePermission;
import java.util.EnumSet;
public class PermissionTest {
public static void main(String[] args) throws IOException {
var dir = Path.of("dir");
Files.deleteIfExists(dir);
Files.createDirectory(dir);
var oldPermissions = Files.getPosixFilePermissions(dir);
Files.setPosixFilePermissions(dir, EnumSet.noneOf(PosixFilePermission.class));
try (var ds = (SecureDirectoryStream<Path>) Files.newDirectoryStream(Path.of("."))) {
var view = ds.getFileAttributeView(dir, PosixFileAttributeView.class);
view.setPermissions(oldPermissions);
}
}
}
---------- END SOURCE ----------
UnixSecureDirectoryStream.PosixFileAttributeViewImpl.setPermissions is implemented by opening the target entry with openat and then using fchmod. But this unnecessarily limits the usage of setPermissions because it's possible that the entry can't be opened but its mode can be changed. Using fchmodat from the directory streams' dirfd would resolve this problem. (And also remove 2 syscalls.)
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
$ java PermissionTest.java
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
successful run of this program
ACTUAL -
Exception in thread "main" java.nio.file.AccessDeniedException: dir
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixSecureDirectoryStream$BasicFileAttributeViewImpl.open(UnixSecureDirectoryStream.java:310)
at java.base/sun.nio.fs.UnixSecureDirectoryStream$PosixFileAttributeViewImpl.setPermissions(UnixSecureDirectoryStream.java:431)
at PermissionTest.main(PermissionTest.java:18)
---------- BEGIN SOURCE ----------
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SecureDirectoryStream;
import java.nio.file.attribute.PosixFileAttributeView;
import java.nio.file.attribute.PosixFilePermission;
import java.util.EnumSet;
public class PermissionTest {
public static void main(String[] args) throws IOException {
var dir = Path.of("dir");
Files.deleteIfExists(dir);
Files.createDirectory(dir);
var oldPermissions = Files.getPosixFilePermissions(dir);
Files.setPosixFilePermissions(dir, EnumSet.noneOf(PosixFilePermission.class));
try (var ds = (SecureDirectoryStream<Path>) Files.newDirectoryStream(Path.of("."))) {
var view = ds.getFileAttributeView(dir, PosixFileAttributeView.class);
view.setPermissions(oldPermissions);
}
}
}
---------- END SOURCE ----------