Java-файл setWritable в JVM с привилегиями - PullRequest
0 голосов
/ 15 февраля 2019

Я собираю Apache Flink из исходного кода, используя Gitlab CI с изображением java:8u111-jdk, и обнаружил, что тесты разрешений для файлов не прошли, потому что разрешения для файлов не соблюдаются.

Один из модульных тестов выглядит так:

    @Test
    public void testDeleteDirectory() throws Exception {

        // deleting a non-existent file should not cause an error

        File doesNotExist = new File(tmp.newFolder(), "abc");
        FileUtils.deleteDirectory(doesNotExist);

        // deleting a write protected file should throw an error

        File cannotDeleteParent = tmp.newFolder();
        File cannotDeleteChild = new File(cannotDeleteParent, "child");

        try {
            assumeTrue(cannotDeleteChild.createNewFile());
            assumeTrue(cannotDeleteParent.setWritable(false));
            assumeTrue(cannotDeleteChild.setWritable(false));

            FileUtils.deleteDirectory(cannotDeleteParent);
            fail("this should fail with an exception");
        }
        catch (AccessDeniedException ignored) {
            // this is expected
        }
        finally {
            //noinspection ResultOfMethodCallIgnored
            cannotDeleteParent.setWritable(true);
            //noinspection ResultOfMethodCallIgnored
            cannotDeleteChild.setWritable(true);
        }
    }

И результат теста:

testDeleteDirectory(org.apache.flink.util.FileUtilsTest)  Time elapsed: 0.022 sec  <<< FAILURE!
java.lang.AssertionError: this should fail with an exception
    at org.junit.Assert.fail(Assert.java:88)
    at org.apache.flink.util.FileUtilsTest.testDeleteDirectory(FileUtilsTest.java:129)

Когда я углубился в коды, я нашел следующие утверждения в java.io.File:

На некоторых платформах может быть возможно запустить виртуальную машину Java со специальными привилегиями, которые позволяют ей изменять файлы, которые запрещают операции записи.

Так что я подозреваю, что что-то не так со средой CI.Как я могу далее отладить проблему?Спасибо!

Среда:

  • Образ докера: java: 8u111-jdk
  • Ядро ОС: Linux 4.9.0-8-amd64 x86_64
  • дистрибутив: Debian 8
  • JDK-версия: openjdk 1.8.0_111

1 Ответ

0 голосов
/ 28 февраля 2019

Проблема в том, что мы запускаем этот код от имени пользователя root, поэтому мы можем удалить файлы, защищенные от записи.

...