Внутри fakeroot, почему chown возвращает EPERM, даже если это удается (но опять же это не так)?

Я занимаюсь причудливым поведением при использовании chown (2) в среде fakeroot. Следующая минимальная программа иллюстрирует проблему:

#include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <sys/stat.h> int main() { //choose a reasonably unique filename char path[30]; sprintf(path, "./file-%d", getpid()); //create file close(creat(path, 0644)); //chown to some random UID/GID chown(path, 4444, 4444); //stat again (result can be seen in strace below) struct stat s; stat(path, &s); return 0; } 

Предположим, что это main.c Теперь я запускаю следующее в fakeroot bash :

 $ gcc -o main main.c $ strace -v ./main ... creat("./file-10872", 0644) = 3 close(3) = 0 ... lchown("./file-10872", 84, 84) = -1 EPERM (Operation not permitted) stat("./file-10872", {st_dev=makedev(8, 3), st_ino=3932971, st_mode=S_IFREG|0644, st_nlink=1, st_uid=1001, st_gid=100, st_blksize=4096, st_blocks=0, st_size=0, st_atime=2015/10/31-20:12:07, st_mtime=2015/10/31-20:12:07, st_ctime=2015/10/31-20:12:07}) = 0 ... $ ls -l file-10872 -rw-r--r-- 1 4444 4444 0 31. Okt 20:12 file-10872 

Что мы можем увидеть здесь?

  1. Не удалось выполнить вызов chown с EPERM (операция не разрешена).
  2. Последующий stat показывает st_uid=1001, st_gid=100 который является моим реальным (не поддельным) UID и GID (что странно, потому что, если я правильно понимаю fakeroot, он должен хотя бы показать st_uid=0, st_gid=0 ).
  3. Последующий ls -l в том же файле показывает, что chown SUCCEEDED, хотя chown сообщил об ошибке, и последующий stat подтвердил это.

Что, черт возьми, происходит здесь? Я нашел ошибку в fakeroot, или это просто непонимание того, как работает fakeroot?

(Мой fakeroot – версия 1.20.2, а моя система – Arch Linux со всеми обновлениями.)

Обновление: Джонас Великки правильно указал, что strace работает на уровне syscall и, таким образом, вводит в заблуждение, так как результаты системных вызовов будут искажены libfakeroot до того, как будут возвращены в саму программу. Оказывается, после stat(path, &s) struct stat s содержит новый UID и GID. Но это все еще запутывает, что chown терпит неудачу с EPERM.

  • Можно ли запустить debootstrap в среде fakeroot?
  • dh_install: libnanomsg-dev отсутствуют файлы (usr / lib / * / lib * .a), прерывание
  • fakeroot-ng с вариантом debootstrap fakechroot висит на makedev
  • fakeroot cdebootstrap: Не удалось отменить: операция не разрешена
  • One Solution collect form web for “Внутри fakeroot, почему chown возвращает EPERM, даже если это удается (но опять же это не так)?”

    chown фактически возвращает ноль при запуске под fakeroot . Таким образом, согласно errno(3) :

    Его значение значимо только тогда, когда возвращаемое значение вызова указывает на ошибку (т. Е. -1 из большинства системных вызовов; -1 или NULL из большинства функций библиотеки); функция, которая преуспевает, имеет право изменять errno.

    Значение в errno не имеет значения, и chown действительно не подведет.

    Как уже обсуждалось в комментариях, вывод strace содержит EPERM и не поддельные uids / gids, как и ожидалось, в виде следов strace ниже библиотеки fakeroot LD_PRELOAD . Печать uid / gid из программы показывает правильный (фальшивый) вывод.

    Interesting Posts

    Как создать настраиваемое динамическое решение DNS?

    Гостевая ОС Ubuntu 12.04 нет сетевого подключения

    Как проверить содержимое / dev / sdt?

    Как перенаправить электронные письма из учетной записи POP3 в другую учетную запись SMTP или IMAP?

    Полноэкранный режим работает в Chrome, но не в Firefox в XMonad

    Debian init.d с рабочим демоном C ++, неожиданными результатами

    Упрощение однострочного вызова с помощью sed и нескольких вызовов awk

    отключить «стереомикс» или звуковой шлейф в linux mint 17.3

    Есть ли удобный общий способ «захватить» эхо-результат команды в Emacs (из M-: или M-!)?

    Как преобразовать таблицу sc в Excel?

    Почему новый пользователь наследовал файлы от удаленного пользователя?

    Удалите все изменения, сделанные Letsencrypt

    Выбор случайной выборки из дерева каталогов

    Ускорьте прокрутку колесика мыши в Chrome на монетном дворе / корица

    Отключение клавиатуры в консоли

    Linux и Unix - лучшая ОС в мире.