Внутри 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.

    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

    Возьмите первые 10 символов строк в файле fastq

    Изменяет ли амплитуда mp3-файла, используя sox, изменение сигнала?

    Какую версию bash я запускаю

    Открыть сообщение с заданным идентификатором сообщения из командной строки в mutt

    Изменение глубины цвета в linux mint

    Обновлено Fedora 23 не загружается в графический логин – только вызывает текстовый терминал

    Перемещайте каждую строку до конца строки, содержащей символ

    Из оболочки, убивая процесс, если время выполнения настенного стола превышает некоторое заданное значение

    Звуки из приложений слишком большие, но я едва слышу их

    Grep для нескольких строк, покажите количество строк после одной из строк (но не другой)

    Процесс зомби нельзя удалить или убить

    Как установить и использовать при планировании заданий?

    Почему запускается Windows вместо grub. Плохие настройки BIOS? Неверное место загрузчика?

    Mutt: автоматическая подписка на почтовые ящики IMAP

    'find -mtime -1 -print | xargs tar 'архивирует все файлы из каталога, игнорируя аргумент -mtime -1

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