linkat(2) Operation not permitted

Oleg Ginzburg olevole at olevole.ru
Sun Sep 15 23:21:08 UTC 2013


Hi

For some reason, creating hardlink within one UFS is failed for /usr/bin/chfn 
with "operation not permitted" messages (other file is ok)

Looks like is UFS-specific because on another system with close revision all 
fine.

system1, zfs, normal behavior:
---
% uname -a
FreeBSD fbsd.my.domain 10.0-ALPHA1 FreeBSD 10.0-ALPHA1 #0 r255570: Sat Sep 14 
22:35:46 MSK 2013     root at fbsd.my.domain:/usr/obj/usr/src/sys/kernel-GENERIC-
amd64-10.0  amd64

% file -s /usr/bin/chfn && ls -la /usr/bin/chfn
/usr/bin/chfn: setuid ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), 
dynamically linked (uses shared libs), for FreeBSD 10.0 (1000055), stripped
-r-sr-xr-x  6 root  wheel  22264 Sep 14 22:25 /usr/bin/chfn

% ln -f /usr/bin/chfn ole
--


system2, ufs:
---
% uname -a
FreeBSD acer.my.domain 10.0-ALPHA1 FreeBSD 10.0-ALPHA1 #0 r255601: Mon Sep 16 
02:38:06 MSK 2013     root at acer.my.domain:/usr/obj/usr/src/sys/GENERIC  amd64

% mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)

%  pwd
/root

% whoami
root

% file -s /usr/bin/chfn && ls -la /usr/bin/chfn
/usr/bin/chfn: setuid ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), 
dynamically linked (uses shared libs), for FreeBSD 10.0 (1000055), stripped
-r-sr-xr-x  6 root  wheel  22264 Sep 16 02:25 /usr/bin/chfn

% ln -f /usr/bin/chfn ole
ln: ole: Operation not permitted

% truss ln -f /usr/bin/chfn ole
mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366140416 
(0x80061b000)
issetugid(0x80081ba10,0x7fffffffefd8,0x40,0x0,0xffff80080081ca38,0x0) = 0 (0x0)
lstat("/etc",{ mode=drwxr-xr-x ,inode=26323968,size=2048,blksize=32768 }) = 0 
(0x0)
lstat("/etc/libmap.conf",{ mode=-rw-r--r-- 
,inode=26324055,size=102,blksize=32768 }) = 0 (0x0)
open("/etc/libmap.conf",O_CLOEXEC,01760)         = 3 (0x3)
fstat(3,{ mode=-rw-r--r-- ,inode=26324055,size=102,blksize=32768 }) = 0 (0x0)
mmap(0x0,102,PROT_READ,MAP_PRIVATE,3,0x0)        = 34366173184 (0x800623000)
close(3)                                         = 0 (0x0)
lstat("/usr",{ mode=drwxr-xr-x ,inode=11797632,size=512,blksize=32768 }) = 0 
(0x0)
lstat("/usr/local",{ mode=drwxr-xr-x ,inode=11797634,size=512,blksize=32768 }) 
= 0 (0x0)
lstat("/usr/local/etc",0x7fffffffb708)           ERR#2 'No such file or directory'
munmap(0x800623000,102)                          = 0 (0x0)
open("/var/run/ld-elf.so.hints",O_CLOEXEC,00)    = 3 (0x3)
read(3,"Ehnt\^A\0\0\0\M^@\0\0\0\^^\0\0\0"...,128) = 128 (0x80)
lseek(3,0x80,SEEK_SET)                           = 128 (0x80)
read(3,"/lib:/usr/lib:/usr/lib/compat\0",30)     = 30 (0x1e)
close(3)                                         = 0 (0x0)
access("/lib/libc.so.7",0)                       = 0 (0x0)
open("/lib/libc.so.7",O_CLOEXEC,030373770)       = 3 (0x3)
fstat(3,{ mode=-r--r--r-- ,inode=5377218,size=1560208,blksize=32768 }) = 0 
(0x0)
mmap(0x0,4096,PROT_READ,MAP_PRIVATE|MAP_PREFAULT_READ,3,0x0) = 34366173184 
(0x800623000)
mmap(0x0,3772416,PROT_NONE,MAP_PRIVATE|MAP_ANON|MAP_NOCORE,-1,0x0) = 
34368245760 (0x80081d000)
mmap(0x80081d000,1458176,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_FIXED|MAP_NOCORE|
MAP_PREFAULT_READ,3,0x0) = 34368245760 (0x80081d000)
mmap(0x800b81000,49152,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|
MAP_PREFAULT_READ,3,0x164000) = 34371801088 (0x800b81000)
mmap(0x800b8d000,167936,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|
MAP_ANON,-1,0x0) = 34371850240 (0x800b8d000)
munmap(0x800623000,4096)                         = 0 (0x0)
close(3)                                         = 0 (0x0)
munmap(0x800622000,4096)                         = 0 (0x0)
mmap(0x0,102400,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 
34366169088 (0x800622000)
sysarch(0x81,0x7fffffffd0f8,0x4,0x0,0xffffffffffab3080,0x8080808080808080) = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|
SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|
SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
readlink("/etc/malloc.conf","abort:false,junk:false",1024) = 22 (0x16)
issetugid(0x800956e53,0x7fffffffc836,0x0,0x0,0x40,0xffffffff0fffffff) = 0 (0x0)
mmap(0x0,4194304,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 
34372018176 (0x800bb6000)
munmap(0x800bb6000,4194304)                      = 0 (0x0)
mmap(0x0,8384512,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 
34372018176 (0x800bb6000)
munmap(0x800bb6000,303104)                       = 0 (0x0)
munmap(0x801000000,3887104)                      = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|
SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|
SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|
SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|
SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
stat("/usr/bin/chfn",{ mode=-r-sr-xr-x 
,inode=11798245,size=22264,blksize=32768 }) = 0 (0x0)
lstat("ole",0x7fffffffc8a8)                      ERR#2 'No such file or directory'
stat("ole",0x7fffffffc8a8)                       ERR#2 'No such file or directory'
lstat("ole",0x7fffffffc8a8)                      ERR#2 'No such file or directory'
linkat(0xffffff9c,0x7fffffffddb6,0xffffff9c,0x7fffffffddc4,0x400,0x8080808080808080) ERR#1 
'Operation not permitted'
ln: write(2,"ln: ",4)                            = 4 (0x4)
olewrite(2,"ole",3)                              = 3 (0x3)
: write(2,": ",2)                                        = 2 (0x2)
mmap(0x0,4194304,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 
34376515584 (0x801000000)
stat("/usr/share/nls/C/libc.cat",0x7fffffffc238) ERR#2 'No such file or directory'
stat("/usr/share/nls/libc/C",0x7fffffffc238)     ERR#2 'No such file or directory'
stat("/usr/local/share/nls/C/libc.cat",0x7fffffffc238) ERR#2 'No such file or 
directory'
stat("/usr/local/share/nls/libc/C",0x7fffffffc238) ERR#2 'No such file or 
directory'
madvise(0x801006000,0x1000,0x5,0xaaaaaaaaaaaaaaab,0x801000030,0x800bb4ab0) = 0 
(0x0)
madvise(0x801007000,0x1000,0x5,0xaaaaaaaaaaaaaaab,0x7fffffffb740,0x800bb4ab0) = 0 
(0x0)
Operation not permitted
write(2,"Operation not permitted\n",24)          = 24 (0x18)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|
SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|
SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|
SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|
SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|
SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|
SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
process exit, rval = 1
---

PS: On system2 ive use default kern_securelevel="-1"
PPS: same behavior on 9.1-RELEASE/ufs



More information about the freebsd-fs mailing list