Closed elwint closed 10 months ago
Problem description
After a hard link failure (because the target already exists), the number of hard links is still increased.
This behavior causes race conditions in programs that rely on hard links for locking (e.g. unison) because of O_EXCL workaround.
Steps to reproduce
In proot environment with --link2symlink:
--link2symlink
$ touch a b $ ln a b ln: b: File exists $ stat -c %h a 2
Example in C:
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int main() { FILE *a, *b; a = fopen("a", "w"); fclose(a); b = fopen("b", "w"); fclose(b); if (link("a", "b") == 0) { printf("Link succeeded\n"); return 0; } struct stat stat_info; if (stat("a", &stat_info) != 0) { printf("Failed to get stats of a\n"); return 1; } printf("Link count is %u\n", stat_info.st_nlink); if (stat_info.st_nlink != 2) { return 1; } return 0; }
Output with PROOT_VERBOSE=9:
PROOT_VERBOSE=9
proot info: vpid 1: sysenter start: openat(0xffffffffffffff9c, 0x7e7e22a450, 0x20441, 0x180, 0x0, 0x0) = 0xffffffffffffff9c [0x7fdc3b5110, 0] proot info: vpid 1: translate("/" + "/root/.ash_history") proot info: vpid 1: -> "/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/alpine/root/.ash_history" proot info: vpid 1: sysenter end: openat(0xffffffffffffff9c, 0x7fdc3b50b1, 0x20441, 0x180, 0x0, 0x0) = 0xffffffffffffff9c [0x7fdc3b50b1, 0] proot info: vpid 1: sysexit start: openat(0x3, 0x7fdc3b50b1, 0x20441, 0x180, 0x0, 0x0) = 0x3 [0x7fdc3b50b1, 0] proot info: vpid 1: sysexit end: openat(0x3, 0x7e7e22a450, 0x20441, 0x180, 0x0, 0x0) = 0x3 [0x7fdc3b5110, 0] proot info: vpid 1: sysenter start: ioctl(0x0, 0x5402, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 1: sysenter end: ioctl(0x0, 0x5402, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 1: sysexit start: ioctl(0x0, 0x5402, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 1: sysexit end: ioctl(0x0, 0x5402, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 3: pid 15110 proot info: vpid 1: sysenter start: wait4(0xffffffffffffffff, 0x7fdc3b515c, 0x2, 0x0, 0x0, 0x0) = 0xffffffffffffffff [0x7fdc3b50b0, 0] proot info: vpid 1: sysenter end: wait4(0xffffffffffffffff, 0x7fdc3b515c, 0x2, 0x0, 0x0, 0x0) = 0xffffffffffffffff [0x7fdc3b50b0, 0] proot info: vpid 3: sysenter start: ioctl(0xa, 0x5410, 0x7fdc3b51ac, 0xfffffff8, 0x7fdc3b5180, 0x7fdc3b5190) = 0xa [0x7fdc3b5150, 0] proot info: vpid 3: sysenter end: ioctl(0xa, 0x5410, 0x7fdc3b51ac, 0xfffffff8, 0x7fdc3b5180, 0x7fdc3b5190) = 0xa [0x7fdc3b5150, 0] proot info: vpid 3: sysexit start: ioctl(0x0, 0x5410, 0x7fdc3b51ac, 0xfffffff8, 0x7fdc3b5180, 0x7fdc3b5190) = 0x0 [0x7fdc3b5150, 0] proot info: vpid 3: sysexit end: ioctl(0x0, 0x5410, 0x7fdc3b51ac, 0xfffffff8, 0x7fdc3b5180, 0x7fdc3b5190) = 0x0 [0x7fdc3b5150, 0] proot info: vpid 3: sysenter start: execve(0x3f000bf090, 0x3f000bf0b0, 0x3f000bf0c0, 0xfefefefefefefeff, 0x2e5a593f004cff00, 0xff73746e2d602e2d) = 0x3f000bf090 [0x7fdc3b5190, 0] proot info: vpid 3: translate("/data/data/com.termux/files/home/tmp" + "./a.out") proot info: vpid 3: -> "/data/data/com.termux/files/home/tmp/a.out" proot info: vpid 3: translate("/" + "/lib/ld-musl-aarch64.so.1") proot info: vpid 3: -> "/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/alpine/lib/ld-musl-aarch64.so.1" proot info: vpid 3: sysenter end: execve(0x7fdc3b515b, 0x3f000bf0b0, 0x3f000bf0c0, 0xfefefefefefefeff, 0x2e5a593f004cff00, 0xff73746e2d602e2d) = 0x7fdc3b515b [0x7fdc3b515b, 0] proot info: vpid 3: sysexit start: io_setup(0x0, 0x0, 0x0, 0x0, 0x0, 0x0) = 0x0 [0x7ffe671ad0, 0] proot info: vpid 3: sysexit end: io_setup(0x7ffe671958, 0x0, 0x0, 0x0, 0x0, 0x0) = 0x7ffe671958 [0x7ffe671958, 0] proot info: vpid 3: sysenter start: openat(0xffffffffffffff9c, 0x7ffe671aa8, 0x0, 0x0, 0x0, 0x0) = 0xffffffffffffff9c [0x7ffe671958, 0] proot info: vpid 3: translate("/data/data/com.termux/files/home/tmp" + "./a.out") proot info: vpid 3: -> "/data/data/com.termux/files/home/tmp/a.out" proot info: vpid 3: sysenter end: openat(0xffffffffffffff9c, 0x7ffe67192d, 0x0, 0x0, 0x0, 0x0) = 0xffffffffffffff9c [0x7ffe67192d, 0] proot info: vpid 3: sysexit start: openat(0x3, 0x7ffe67192d, 0x0, 0x0, 0x0, 0x0) = 0x3 [0x7ffe67192d, 0] proot info: vpid 3: sysexit end: openat(0x3, 0x7ffe671aa8, 0x0, 0x0, 0x0, 0x0) = 0x3 [0x7ffe671958, 0] proot info: vpid 3: sysenter start: openat(0xffffffffffffff9c, 0x7ffe671ab0, 0x0, 0x0, 0x3, 0xf000) = 0xffffffffffffff9c [0x7ffe671958, 0] proot info: vpid 3: translate("/" + "/lib/ld-musl-aarch64.so.1") proot info: vpid 3: -> "/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/alpine/lib/ld-musl-aarch64.so.1" proot info: vpid 3: sysenter end: openat(0xffffffffffffff9c, 0x7ffe6718f2, 0x0, 0x0, 0x3, 0xf000) = 0xffffffffffffff9c [0x7ffe6718f2, 0] proot info: vpid 3: sysexit start: openat(0x3, 0x7ffe6718f2, 0x0, 0x0, 0x3, 0xf000) = 0x3 [0x7ffe6718f2, 0] proot info: vpid 3: sysexit end: openat(0x3, 0x7ffe671ab0, 0x0, 0x0, 0x3, 0xf000) = 0x3 [0x7ffe671958, 0] proot info: vpid 3: sysenter start: prctl(0xf, 0x7ffe671aaa, 0x0, 0x32, 0xffffffffffffffff, 0x0) = 0xf [0x7ffe671958, 0] proot info: vpid 3: sysenter end: prctl(0xf, 0x7ffe671aaa, 0x0, 0x32, 0xffffffffffffffff, 0x0) = 0xf [0x7ffe671958, 0] proot info: vpid 3: sysenter start: brk(0x0, 0x1000, 0x3f000c07c0, 0x1000, 0x7ffe671d08, 0x7ffe671750) = 0x0 [0x7ffe671700, 0] proot info: vpid 3: sysenter end: mmap(0x3000021000, 0x1000, 0x3, 0x22, 0xffffffffffffffff, 0x0) = 0x3000021000 [0x7ffe671700, 0] proot info: vpid 3: sysexit start: mmap(0x3000021000, 0x1000, 0x3, 0x22, 0xffffffffffffffff, 0x0) = 0x3000021000 [0x7ffe671700, 0] proot info: vpid 3: sysexit end: brk(0x3000022000, 0x1000, 0x3f000c07c0, 0x1000, 0x7ffe671d08, 0x7ffe671750) = 0x3000022000 [0x7ffe671700, 0] proot info: vpid 3: sysenter start: brk(0x3000024000, 0xfff, 0x3f000c07c0, 0x1000, 0x7ffe671d08, 0x7ffe671750) = 0x3000024000 [0x7ffe671700, 0] proot info: vpid 3: sysenter end: mremap(0x3000021000, 0x1000, 0x3000, 0x0, 0x0, 0x7ffe671750) = 0x3000021000 [0x7ffe671700, 0] proot info: vpid 3: sysexit start: mremap(0x3000021000, 0x1000, 0x3000, 0x0, 0x0, 0x7ffe671750) = 0x3000021000 [0x7ffe671700, 0] proot info: vpid 3: sysexit end: brk(0x3000024000, 0xfff, 0x3f000c07c0, 0x1000, 0x7ffe671d08, 0x7ffe671750) = 0x3000024000 [0x7ffe671700, 0] proot info: vpid 3: sysenter start: openat(0xffffffffffffff9c, 0x3000000ae8, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0xffffffffffffff9c [0x7ffe6719c0, 0] proot info: vpid 3: translate("/data/data/com.termux/files/home/tmp" + "a") proot info: vpid 3: -> "/data/data/com.termux/files/home/tmp/a" proot info: vpid 3: sysenter end: openat(0xffffffffffffff9c, 0x7ffe671999, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0xffffffffffffff9c [0x7ffe671999, 0] proot info: vpid 3: sysexit start: openat(0x3, 0x7ffe671999, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe671999, 0] proot info: vpid 3: sysexit end: openat(0x3, 0x3000000ae8, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe6719c0, 0] proot info: vpid 3: sysenter start: ioctl(0x3, 0x5413, 0x7ffe6719b8, 0x7ae818f110, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe671980, 0] proot info: vpid 3: sysenter end: ioctl(0x3, 0x5413, 0x7ffe6719b8, 0x7ae818f110, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe671980, 0] proot info: vpid 3: sysexit start: ioctl(0xfffffffffffffff3, 0x5413, 0x7ffe6719b8, 0x7ae818f110, 0x6464646464646411, 0xfefefefefefeff76) = 0xfffffffffffffff3 [0x7ffe671980, 0] proot info: vpid 3: sysexit end: ioctl(0xfffffffffffffff3, 0x5413, 0x7ffe6719b8, 0x7ae818f110, 0x6464646464646411, 0xfefefefefefeff76) = 0xfffffffffffffff3 [0x7ffe671980, 0] proot info: vpid 3: sysenter start: openat(0xffffffffffffff9c, 0x3000000af0, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0xffffffffffffff9c [0x7ffe6719c0, 0] proot info: vpid 3: translate("/data/data/com.termux/files/home/tmp" + "b") proot info: vpid 3: -> "/data/data/com.termux/files/home/tmp/b" proot info: vpid 3: sysenter end: openat(0xffffffffffffff9c, 0x7ffe671999, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0xffffffffffffff9c [0x7ffe671999, 0] proot info: vpid 3: sysexit start: openat(0x3, 0x7ffe671999, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe671999, 0] proot info: vpid 3: sysexit end: openat(0x3, 0x3000000af0, 0x20241, 0x1b6, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe6719c0, 0] proot info: vpid 3: sysenter start: ioctl(0x3, 0x5413, 0x7ffe6719b8, 0x7ae818f120, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe671980, 0] proot info: vpid 3: sysenter end: ioctl(0x3, 0x5413, 0x7ffe6719b8, 0x7ae818f120, 0x6464646464646411, 0xfefefefefefeff76) = 0x3 [0x7ffe671980, 0] proot info: vpid 3: sysexit start: ioctl(0xfffffffffffffff3, 0x5413, 0x7ffe6719b8, 0x7ae818f120, 0x6464646464646411, 0xfefefefefefeff76) = 0xfffffffffffffff3 [0x7ffe671980, 0] proot info: vpid 3: sysexit end: ioctl(0xfffffffffffffff3, 0x5413, 0x7ffe6719b8, 0x7ae818f120, 0x6464646464646411, 0xfefefefefefeff76) = 0xfffffffffffffff3 [0x7ffe671980, 0] proot info: vpid 3: sysenter start: linkat(0xffffffffffffff9c, 0x3000000ae8, 0xffffffffffffff9c, 0x3000000af0, 0x0, 0x3000023180) = 0xffffffffffffff9c [0x7ffe6719e0, 0] proot info: vpid 3: translate("/data/data/com.termux/files/home/tmp" + "a") proot info: vpid 3: -> "/data/data/com.termux/files/home/tmp/a" proot info: vpid 3: translate("/data/data/com.termux/files/home/tmp" + "b") proot info: vpid 3: -> "/data/data/com.termux/files/home/tmp/b" proot info: vpid 3: sysenter end: symlinkat(0x7ffe671935, 0xffffffffffffff9c, 0x7ffe671992, 0x7ffe671992, 0x0, 0x3000023180) = 0x7ffe671935 [0x7ffe671935, 0] proot info: vpid 3: sysexit start: symlinkat(0xffffffffffffffef, 0xffffffffffffff9c, 0x7ffe671992, 0x7ffe671992, 0x0, 0x3000023180) = 0xffffffffffffffef [0x7ffe671935, 0] proot info: vpid 3: sysexit end: linkat(0xffffffffffffffef, 0x3000000ae8, 0xffffffffffffff9c, 0x3000000af0, 0x0, 0x3000023180) = 0xffffffffffffffef [0x7ffe6719e0, 0] proot info: vpid 3: sysenter start: fstatat64(0xffffffffffffff9c, 0x3000000ae8, 0x7ffe671970, 0x0, 0x0, 0x3000000ae8) = 0xffffffffffffff9c [0x7ffe671920, 0] proot info: vpid 3: translate("/data/data/com.termux/files/home/tmp" + "a") proot info: vpid 3: -> "/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/alpine/.l2s/.l2s.a0017.0002" proot info: vpid 3: sysenter end: fstatat64(0xffffffffffffff9c, 0x7ffe6718be, 0x7ffe671970, 0x0, 0x0, 0x3000000ae8) = 0xffffffffffffff9c [0x7ffe6718be, 0] proot info: vpid 3: sysexit start: fstatat64(0x0, 0x7ffe6718be, 0x7ffe671970, 0x0, 0x0, 0x3000000ae8) = 0x0 [0x7ffe6718be, 0] proot info: vpid 3: sysexit end: fstatat64(0x0, 0x3000000ae8, 0x7ffe671970, 0x0, 0x0, 0x3000000ae8) = 0x0 [0x7ffe671920, 0] proot info: vpid 3: sysenter start: ioctl(0x1, 0x5413, 0x7ffe671628, 0x3f000c02b0, 0x3000000b38, 0x1) = 0x1 [0x7ffe671610, 0] proot info: vpid 3: sysenter end: ioctl(0x1, 0x5413, 0x7ffe671628, 0x3f000c02b0, 0x3000000b38, 0x1) = 0x1 [0x7ffe671610, 0] proot info: vpid 3: sysexit start: ioctl(0x0, 0x5413, 0x7ffe671628, 0x3f000c02b0, 0x3000000b38, 0x1) = 0x0 [0x7ffe671610, 0] proot info: vpid 3: sysexit end: ioctl(0x0, 0x5413, 0x7ffe671628, 0x3f000c02b0, 0x3000000b38, 0x1) = 0x0 [0x7ffe671610, 0] Link count is 2 proot info: vpid 3: exited with status 0 proot info: vpid 1: sysexit start: wait4(0x3b06, 0x7fdc3b515c, 0x2, 0x0, 0x0, 0x0) = 0x3b06 [0x7fdc3b50b0, 0] proot info: vpid 1: sysexit end: wait4(0x3b06, 0x7fdc3b515c, 0x2, 0x0, 0x0, 0x0) = 0x3b06 [0x7fdc3b50b0, 0] proot info: vpid 1: sysenter start: wait4(0xffffffffffffffff, 0x7fdc3b515c, 0x3, 0x0, 0x0, 0x0) = 0xffffffffffffffff [0x7fdc3b50b0, 0] proot info: vpid 1: sysenter end: wait4(0xffffffffffffffff, 0x7fdc3b515c, 0x3, 0x0, 0x0, 0x0) = 0xffffffffffffffff [0x7fdc3b50b0, 0] proot info: vpid 1: sysexit start: wait4(0xfffffffffffffff6, 0x7fdc3b515c, 0x3, 0x0, 0x0, 0x0) = 0xfffffffffffffff6 [0x7fdc3b50b0, 0] proot info: vpid 1: sysexit end: wait4(0xfffffffffffffff6, 0x7fdc3b515c, 0x3, 0x0, 0x0, 0x0) = 0xfffffffffffffff6 [0x7fdc3b50b0, 0] proot info: vpid 1: sysenter start: ioctl(0xa, 0x5410, 0x7fdc3b520c, 0xfffffff8, 0x7fdc3b51e0, 0x7fdc3b51f0) = 0xa [0x7fdc3b51b0, 0] proot info: vpid 1: sysenter end: ioctl(0xa, 0x5410, 0x7fdc3b520c, 0xfffffff8, 0x7fdc3b51e0, 0x7fdc3b51f0) = 0xa [0x7fdc3b51b0, 0] proot info: vpid 1: sysexit start: ioctl(0x0, 0x5410, 0x7fdc3b520c, 0xfffffff8, 0x7fdc3b51e0, 0x7fdc3b51f0) = 0x0 [0x7fdc3b51b0, 0] proot info: vpid 1: sysexit end: ioctl(0x0, 0x5410, 0x7fdc3b520c, 0xfffffff8, 0x7fdc3b51e0, 0x7fdc3b51f0) = 0x0 [0x7fdc3b51b0, 0] proot info: vpid 1: sysenter start: fstatat64(0xffffffffffffff9c, 0x3f000bf048, 0x7fdc3b5470, 0x0, 0x30000c0561, 0x3f000bf048) = 0xffffffffffffff9c [0x7fdc3b5420, 0] proot info: vpid 1: translate("/data/data/com.termux/files/home/tmp" + "MAILPATH") proot info: vpid 1: -> "/data/data/com.termux/files/home/tmp/MAILPATH" proot info: vpid 1: sysenter end: fstatat64(0xffffffffffffff9c, 0x7fdc3b53f2, 0x7fdc3b5470, 0x0, 0x30000c0561, 0x3f000bf048) = 0xffffffffffffff9c [0x7fdc3b53f2, 0] proot info: vpid 1: sysexit start: fstatat64(0xfffffffffffffffe, 0x7fdc3b53f2, 0x7fdc3b5470, 0x0, 0x30000c0561, 0x3f000bf048) = 0xfffffffffffffffe [0x7fdc3b53f2, 0] proot info: vpid 1: sysexit end: fstatat64(0xfffffffffffffffe, 0x3f000bf048, 0x7fdc3b5470, 0x0, 0x30000c0561, 0x3f000bf048) = 0xfffffffffffffffe [0x7fdc3b5420, 0] proot info: vpid 1: sysenter start: ioctl(0x0, 0x5401, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5130, 0x7fdc3b5140) = 0x0 [0x7fdc3b5100, 0] proot info: vpid 1: sysenter end: ioctl(0x0, 0x5401, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5130, 0x7fdc3b5140) = 0x0 [0x7fdc3b5100, 0] proot info: vpid 1: sysexit start: ioctl(0x0, 0x5401, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5130, 0x7fdc3b5140) = 0x0 [0x7fdc3b5100, 0] proot info: vpid 1: sysexit end: ioctl(0x0, 0x5401, 0x7fdc3b5280, 0xfffffff8, 0x7fdc3b5130, 0x7fdc3b5140) = 0x0 [0x7fdc3b5100, 0] proot info: vpid 1: sysenter start: ioctl(0x0, 0x5402, 0x7fdc3b52c0, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 1: sysenter end: ioctl(0x0, 0x5402, 0x7fdc3b52c0, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 1: sysexit start: ioctl(0x0, 0x5402, 0x7fdc3b52c0, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 1: sysexit end: ioctl(0x0, 0x5402, 0x7fdc3b52c0, 0xfffffff8, 0x7fdc3b5170, 0x7fdc3b5180) = 0x0 [0x7fdc3b5140, 0] proot info: vpid 1: sysenter start: ioctl(0x0, 0x5413, 0x7fdc3b5150, 0xfffffff8, 0x7fdc3b5110, 0x7fdc3b5120) = 0x0 [0x7fdc3b50e0, 0] proot info: vpid 1: sysenter end: ioctl(0x0, 0x5413, 0x7fdc3b5150, 0xfffffff8, 0x7fdc3b5110, 0x7fdc3b5120) = 0x0 [0x7fdc3b50e0, 0] proot info: vpid 1: sysexit start: ioctl(0x0, 0x5413, 0x7fdc3b5150, 0xfffffff8, 0x7fdc3b5110, 0x7fdc3b5120) = 0x0 [0x7fdc3b50e0, 0] proot info: vpid 1: sysexit end: ioctl(0x0, 0x5413, 0x7fdc3b5150, 0xfffffff8, 0x7fdc3b5110, 0x7fdc3b5120) = 0x0 [0x7fdc3b50e0, 0] proot info: vpid 1: sysenter start: uname(0x7fdc3b4f40, 0x0, 0x7e7e226cc1, 0x68, 0x5c, 0x7fdc3b5148) = 0x7fdc3b4f40 [0x7fdc3b4f20, 0] proot info: vpid 1: sysenter end: uname(0x7fdc3b4f40, 0x0, 0x7e7e226cc1, 0x68, 0x5c, 0x7fdc3b5148) = 0x7fdc3b4f40 [0x7fdc3b4f20, 0] proot info: vpid 1: sysexit start: uname(0x0, 0x0, 0x7e7e226cc1, 0x68, 0x5c, 0x7fdc3b5148) = 0x0 [0x7fdc3b4f20, 0] proot info: vpid 1: sysexit end: uname(0x0, 0x0, 0x7e7e226cc1, 0x68, 0x5c, 0x7fdc3b5148) = 0x0 [0x7fdc3b4f20, 0] proot info: vpid 1: sysenter start: geteuid(0x24, 0x7e7e226cc7, 0x7e7e226cc6, 0x24, 0x5c, 0x7fdc3b5148) = 0x24 [0x7fdc3b50d0, 0] proot info: vpid 1: sysenter end: geteuid(0x24, 0x7e7e226cc7, 0x7e7e226cc6, 0x24, 0x5c, 0x7fdc3b5148) = 0x24 [0x7fdc3b50d0, 0] proot info: vpid 1: sysexit start: geteuid(0x2833, 0x7e7e226cc7, 0x7e7e226cc6, 0x24, 0x5c, 0x7fdc3b5148) = 0x2833 [0x7fdc3b50d0, 0] proot info: vpid 1: sysexit end: geteuid(0x0, 0x7e7e226cc7, 0x7e7e226cc6, 0x24, 0x5c, 0x7fdc3b5148) = 0x0 [0x7fdc3b50d0, 0]
Expected behavior
Number of links of a should remain 1.
a
Additional information
Termux Variables: TERMUX_APK_RELEASE=F_DROID TERMUX_APP_PACKAGE_MANAGER=apt TERMUX_APP_PID=13606 TERMUX_IS_DEBUGGABLE_BUILD=0 TERMUX_MAIN_PACKAGE_FORMAT=debian TERMUX_VERSION=0.118.0 Packages CPU architecture: aarch64 Subscribed repositories: # sources.list deb https://mirror.mwt.me/termux/main stable main # x11-repo (sources.list.d/x11.list) deb https://mirror.mwt.me/termux/x11 x11 main Updatable packages: All packages up to date termux-tools version: 1.38.5 Android version: 12 Kernel build information: Linux localhost 4.19.157-perf-g61dd92dde17b #1 SMP PREEMPT Wed Feb 22 15:59:27 CST 2023 aarch64 Android Device manufacturer: Xiaomi Device model: M2012K11AG LD Variables: LD_LIBRARY_PATH= LD_PRELOAD=/data/data/com.termux/files/usr/lib/libtermux-exec.so Installed termux plugins: com.termux.widget versionCode:13
Fixed and available in apt as proot-5.1.107-61 (might take some time to propagate to mirrors)
proot-5.1.107-61
Thanks looks like the hard link count works correctly now
Problem description
After a hard link failure (because the target already exists), the number of hard links is still increased.
This behavior causes race conditions in programs that rely on hard links for locking (e.g. unison) because of O_EXCL workaround.
Steps to reproduce
In proot environment with
--link2symlink
:Example in C:
Output with
PROOT_VERBOSE=9
:Expected behavior
Number of links of
a
should remain 1.Additional information