Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8357425

(fs) SecureDirectoryStream setPermissions should use fchmodat

XMLWordPrintable

    • generic
    • linux, os_x

      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 ----------

            bpb Brian Burkhalter
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: