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

Posix group write and others write file permissions not set when using java.nio.file.Files.createFile

XMLWordPrintable

    • x86_64
    • linux

      FULL PRODUCT VERSION :
      Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Linux lxdmgdev 3.0.82-0.7-xen #1 SMP Thu Jun 27 13:19:18 UTC 2013 (6efde93) x86_64 x86_64 x86_64 GNU/Linux

      A DESCRIPTION OF THE PROBLEM :
      Those cases end up without group and others write permission:

      case nioc:
      Files.createFile(
      Paths.get(file.getPath()),
      PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwxrwxrwx")));
      break;
      case nioc2:
      Files.createFile(
      Paths.get(file.getPath()),
      PosixFilePermissions.asFileAttribute(new HashSet<PosixFilePermission>(Arrays.asList(
      PosixFilePermission.OWNER_READ,
      PosixFilePermission.OWNER_WRITE,
      PosixFilePermission.OWNER_EXECUTE,
      PosixFilePermission.GROUP_READ,
      PosixFilePermission.GROUP_WRITE,
      PosixFilePermission.GROUP_EXECUTE,
      PosixFilePermission.OTHERS_READ,
      PosixFilePermission.OTHERS_WRITE,
      PosixFilePermission.OTHERS_EXECUTE))));
      break;


      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Group write and others write Posix file permissions set
      ACTUAL -
      Group write and others write Posix file permissions missing

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      import java.io.File;
      import java.io.IOException;
      import java.nio.file.Files;
      import java.nio.file.Paths;
      import java.nio.file.attribute.PosixFilePermission;
      import java.nio.file.attribute.PosixFilePermissions;
      import java.util.Arrays;
      import java.util.HashSet;

      public class FilePermissions {
      private enum Instruction {
      file, nioc, nioc2, nios, nios2;
      }

      private interface Arguments {
      String getFilenamePrefix();
      }

          public static void main(String[] aArguments) throws IOException {
           Arguments arguments = parse(aArguments);
              final String filenamePrefix = arguments.getFilenamePrefix();
              for (Instruction instruction: Instruction.values()) {
           perInstruction(
           new File(String.format("%s.%s.txt", filenamePrefix, instruction.name())),
           instruction);
      }
              System.out.println("Done");
          }

      protected static void perInstruction(File file, final Instruction instruction) throws IOException {
      System.out.println(String.format(
      "Creating %s using %s",
      file.getPath(),
      instruction.name()));
      switch (instruction) {
      case file:
               if (file.createNewFile()) {
                   file.setExecutable(true, false);
                      file.setReadable(true, false);
                      file.setWritable(true, false);
               } else {
               System.err.println(String.format("Die Datei %s existiert bereits", file.getPath()));
               }
      break;
      case nioc:
      Files.createFile(
      Paths.get(file.getPath()),
      PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwxrwxrwx")));
      break;
      case nioc2:
      Files.createFile(
      Paths.get(file.getPath()),
      PosixFilePermissions.asFileAttribute(new HashSet<PosixFilePermission>(Arrays.asList(
      PosixFilePermission.OWNER_READ,
      PosixFilePermission.OWNER_WRITE,
      PosixFilePermission.OWNER_EXECUTE,
      PosixFilePermission.GROUP_READ,
      PosixFilePermission.GROUP_WRITE,
      PosixFilePermission.GROUP_EXECUTE,
      PosixFilePermission.OTHERS_READ,
      PosixFilePermission.OTHERS_WRITE,
      PosixFilePermission.OTHERS_EXECUTE))));
      break;
      case nios:
      if (!file.createNewFile()) {
               System.err.println(String.format("Die Datei %s konnte nicht erstellt werden", file.getPath()));
      }
      Files.setPosixFilePermissions(
      Paths.get(file.getPath()),
      PosixFilePermissions.fromString("rwxrwxrwx"));
      break;
      case nios2:
      if (!file.createNewFile()) {
               System.err.println(String.format("Die Datei %s konnte nicht erstellt werden", file.getPath()));
      }
      Files.setPosixFilePermissions(
      Paths.get(file.getPath()),
      new HashSet<PosixFilePermission>(Arrays.asList(
      PosixFilePermission.OWNER_READ,
      PosixFilePermission.OWNER_WRITE,
      PosixFilePermission.OWNER_EXECUTE,
      PosixFilePermission.GROUP_READ,
      PosixFilePermission.GROUP_WRITE,
      PosixFilePermission.GROUP_EXECUTE,
      PosixFilePermission.OTHERS_READ,
      PosixFilePermission.OTHERS_WRITE,
      PosixFilePermission.OTHERS_EXECUTE)));
      break;
      default:
      break;
      }
      }

      private static Arguments parse(String[] aArguments) {
      String filenamePrefix = null;
      for (int index = 0; index < aArguments.length; index++) {
      switch (index) {
      case 0:
      filenamePrefix = aArguments[index];
      break;
      default:
      break;
      }
      }
      if (null == filenamePrefix) {
      throw new RuntimeException("Syntax: java this.jar {file} file|nio");
      }
      final String filenamePrefixFinal = filenamePrefix;
      return new Arguments() {
      public String getFilenamePrefix() {
      return filenamePrefixFinal;
      }
      };
      }

      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Use java.nio.file.Files.setPosixFilePermissions(Path, Set<PosixFilePermission>) after creating the file.

        1. JI9047597.java
          4 kB
          Pallavi Sonal
        2. output.JPG
          62 kB
          Pallavi Sonal

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

              Created:
              Updated:
              Resolved: