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

  • fakeroot-ng с вариантом debootstrap fakechroot висит на makedev
  • Можно ли запустить debootstrap в среде fakeroot?
  • dh_install: libnanomsg-dev отсутствуют файлы (usr / lib / * / lib * .a), прерывание
  • 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

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

    Графическое исправление ошибок? Исправленный файл op оставил тень «почти drag-n-drop» файла, как его удалить?

    Как я могу просмотреть статистику i / o для краткого запуска процесса?

    Сбой плагина Java на Ubuntu 16.04 / Firefox ESR 52.2.0

    эквивалент часов в zsh

    Почему нет простой скользящей средней 1/5/15 минут, используемой при вычислении нагрузки Linux?

    Пользователь имеет права на запись, но не может записывать файлы

    Как сделать grep в реальном журнале (stdout)?

    Параметры списка опций zsh apt

    CHROOT: невозможно скопировать файлы в папку с изолированными пользователями с локальной машины с помощью WINSCP

    Как я могу наблюдать за созданием определенного «триггерного файла»?

    Что означает ** ___________ в / etc / shadow?

    Проблема с производительностью ввода-вывода диска

    Как разрешить пользователю OpenLDAP записывать данные в точку монтирования SSHFS?

    Как избежать системного тайм-аута на экране входа в систему, когда я делаю чашку чая?

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