termux / proot

An chroot-like implementation using ptrace.
https://wiki.termux.com/wiki/PRoot
Other
742 stars 162 forks source link

Incorrect number of hard links (st_nlink) with link2symlink after hard link failed (which breaks locks) #284

Closed elwint closed 10 months ago

elwint commented 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:

$ 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 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.

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
michalbednarski commented 10 months ago

Fixed and available in apt as proot-5.1.107-61 (might take some time to propagate to mirrors)

elwint commented 10 months ago

Thanks looks like the hard link count works correctly now