errno has no meaning after successful calls.
It does not stay 0. So, "illegal seek" msg is bogus.
(1) uncomment error messages on error paths.
your setuid() call seems to fail, and you don't see why.
(2) run your program under strace.
Thank your for your reply Denys!
My code:
#define ERROR(fmt, ...) \
syslog(LOG_ERR, fmt ", errno %d (%m)", ##__VA_ARGS__, errno)
int8_t drop_root(const char *user)
{
ERROR("Run %s, user %s", __func__, user);
struct passwd *pwd = NULL;
int r;
if (NULL == (pwd = getpwnam(user)))
return -1;
ERROR("After getpwnam, uid = %d, gid = %d", pwd->pw_uid, pwd->pw_gid);
r = setgid(pwd->pw_gid);
if (r) {
ERROR("ERROR: After setGID, r = %d", r);
return -1;
}
ERROR("After setGID, r = %d", r);
r= setuid(pwd->pw_uid);
if (r) {
ERROR("ERROR: After setUID, r = %d", r);
return -1;
}
ERROR("After setUID, r = %d", r);
return 0;
}
Manul running:
monitor: Run drop_root, user monitor, errno 0 (Success)
monitor: After getpwnam, uid = 100, gid = 100, errno 0 (Success)
monitor: After setGID, r = 0, errno 29 (Illegal seek)
monitor: After setUID, r = 0, errno 29 (Illegal seek)
monitor: Ready to send message
Strace:
.....................
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001e000
set_tls(0x4001e0a0, 0x4001f000, 0x4001e7f8, 0x4001e778, 0x40025050) = 0
mprotect(0x40145000, 4096, PROT_READ) = 0
access("/etc/monitor", F_OK) = 0
brk(0) = 0x14000
brk(0x35000) = 0x35000
gettimeofday({946686039, 822996}, NULL) = 0
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
socket(PF_FILE, SOCK_DGRAM, 0) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
connect(3, {sa_family=AF_FILE, path="/dev/log"...}, 110) = -1 ENOENT (No
such file or directory)
close(3) = 0
open("/dev/console", O_WRONLY|O_NOCTTY) = 3
fstat64(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(5, 1), ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo
...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
_llseek(3, 0, 0xbed55910, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, "monitor: Run drop_root, user moni"..., 57monitor: Run
drop_root, user monitor, errno 0 (Success)
) = 57
munmap(0x4001f000, 4096) = 0
close(3) = 0
socket(PF_FILE, SOCK_STREAM, 0) = 3
fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"...}, 110) =
-1 ENOENT (No such file or directory)
close(3) = 0
socket(PF_FILE, SOCK_STREAM, 0) = 3
fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"...}, 110) =
-1 ENOENT (No such file or directory)
close(3) = 0
open("/etc/nsswitch.conf", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=224, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
read(3, "passwd: files\ngroup: "..., 4096) = 224
read(3, ""..., 4096) = 0
close(3) = 0
munmap(0x4001f000, 4096) = 0
open("/lib/libnss_files.so.2", O_RDONLY) = 3
read(3,
"\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\254\30\0\0004\0\0\0d"..., 512)
= 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=50108, ...}) = 0
mmap2(NULL, 70324, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)
= 0x4014b000
mprotect(0x40154000, 28672, PROT_NONE) = 0
mmap2(0x4015b000, 8192, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8) = 0x4015b000
close(3) = 0
mprotect(0x4015b000, 4096, PROT_READ) = 0
open("/etc/passwd", O_RDONLY) = 3
fcntl64(3, F_GETFD) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=91, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
read(3, "root:x:0:0:root:/root:/bin/sh\nmon"..., 4096) = 91
close(3) = 0
munmap(0x4001f000, 4096) = 0
gettimeofday({946686040, 242418}, NULL) = 0
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
socket(PF_FILE, SOCK_DGRAM, 0) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
connect(3, {sa_family=AF_FILE, path="/dev/log"...}, 110) = -1 ENOENT (No
such file or directory)
close(3) = 0
open("/dev/console", O_WRONLY|O_NOCTTY) = 3
fstat64(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(5, 1), ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo
...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
_llseek(3, 0, 0xbed55910, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, "monitor: After getpwnam, uid = 10"..., 66monitor: After
getpwnam, uid = 100, gid = 100, errno 0 (Success)
) = 66
munmap(0x4001f000, 4096) = 0
close(3) = 0
setgid32(100) = 0
gettimeofday({946686040, 265991}, NULL) = 0
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
socket(PF_FILE, SOCK_DGRAM, 0) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
connect(3, {sa_family=AF_FILE, path="/dev/log"...}, 110) = -1 ENOENT (No
such file or directory)
close(3) = 0
open("/dev/console", O_WRONLY|O_NOCTTY) = 3
fstat64(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(5, 1), ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo
...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
_llseek(3, 0, 0xbed55910, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, "monitor: After setGID, r = 0, err"..., 55monitor: After
setGID, r = 0, errno 29 (Illegal seek)
) = 55
munmap(0x4001f000, 4096) = 0
close(3) = 0
setuid32(100) = 0
gettimeofday({946686040, 621567}, NULL) = 0
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
socket(PF_FILE, SOCK_DGRAM, 0) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
connect(3, {sa_family=AF_FILE, path="/dev/log"...}, 110) = -1 ENOENT (No
such file or directory)
close(3) = 0
open("/dev/console", O_WRONLY|O_NOCTTY) = 3
fstat64(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(5, 1), ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo
...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
_llseek(3, 0, 0xbed55910, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, "monitor: After setUID, r = 0, err"..., 55monitor: After
setUID, r = 0, errno 29 (Illegal seek)
) = 55
munmap(0x4001f000, 4096) = 0
close(3) = 0
rt_sigaction(SIGINT, {0x9444, [INT], SA_RESTART|0x4000000}, NULL, 8) = 0
rt_sigaction(SIGTERM, {0x9444, [TERM], SA_RESTART|0x4000000}, NULL, 8) = 0
rt_sigaction(SIGHUP, {0x9444, [HUP], SA_RESTART|0x4000000}, NULL, 8) = 0
open("/etc/monitor", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=48, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
read(3, "PORT=65000\nBROADCAST=1\nSERVER=0.0"..., 4096) = 48
read(3, ""..., 4096) = 0
close(3) = 0
munmap(0x4001f000, 4096) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
ioctl(3, SIOCGIFADDR, {ifr_name="eth0", ifr_addr={AF_INET,
inet_addr("192.168.255.2")}}) = 0
close(3) = 0
socket(PF_NETLINK, SOCK_RAW, 0) = 3
bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=329, groups=00000000}, [12]) = 0
gettimeofday({946686040, 668309}, NULL) = 0
sendto(3, "\24\0\0\0\26\0\1\3XHm8\0\0\0\0\0\0\0\0"..., 20, 0,
{sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000},
msg_iov(1)=[{"<\0\0\0\24\0\2\0XHm8I\1\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1\10"...,
4096}], msg_controllen=0, msg_flags=0}, 0) = 128
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000},
msg_iov(1)=[{"\24\0\0\0\3\0\2\0XHm8I\1\0\0\0\0\0\0\1\0\0\0\10\0\1\0\177\0\0\1\10"...,
4096}], msg_controllen=0, msg_flags=0}, 0) = 20
close(3) = 0
open("/etc/gai.conf", O_RDONLY) = -1 ENOENT (No such file or
directory)
socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = -1 EAFNOSUPPORT (Address
family not supported by protocol)
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(65000),
sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(3, {sa_family=AF_INET, sin_port=htons(3072),
sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
close(3) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(65000),
sin_addr=inet_addr("0.0.0.0")}, 16) = 0
gettimeofday({946686040, 698108}, NULL) = 0
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
open("/etc/localtime", O_RDONLY) = -1 ENOENT (No such file or
directory)
socket(PF_FILE, SOCK_DGRAM, 0) = 4
fcntl64(4, F_SETFD, FD_CLOEXEC) = 0
connect(4, {sa_family=AF_FILE, path="/dev/log"...}, 110) = -1 ENOENT (No
such file or directory)
close(4) = 0
open("/dev/console", O_WRONLY|O_NOCTTY) = 4
fstat64(4, {st_mode=S_IFCHR|0660, st_rdev=makedev(5, 1), ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B115200 opost isig icanon echo
...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x4001f000
_llseek(4, 0, 0xbed55938, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(4, "monitor: Ready to send message\r\n"..., 32monitor: Ready to
send message
) = 32
munmap(0x4001f000, 4096) = 0
close(4)
Running with system:
monitor: Run drop_root, user monitor, errno 0 (Success)
monitor: After getpwnam, uid = 100, gid = 100, errno 0 (Success)
monitor: After setGID, r = 0, errno 29 (Illegal seek)
Thank you.
--
Best regards,
Brilliantov Kirill Vladimirovich
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox