Package: mmdebstrap
Version: 0.7.5-2.2
Severity: minor

I see a quite odd behaviour where "find ... -type f" inside a customize hook is 
matching device files.
As a simple test, "find /dev -type f" finds /dev/zero inside mmdebstrap, but 
not outside mmdebstrap.

The problem doesn't appear to be affecting stat, test, or python -- only find.
I haven't tested with bwrap or unshare(1) instead of mmdebstrap – I'm not sure 
exactly how.
If find fails for those, clearly this bug should be reassigned to findutils.

I speculate this is some interaction between unshare(2) and stat(2) that may be 
a bug in find.
I looked at the strace, but I can't see anything obvious.

Here is some basic investigation outside mmdebstrap:

    bash5$ find /dev/ -type f
    [no matches]

    bash5$ strace -e trace=file find /dev/zero -type f -print -quit
    execve("/usr/bin/find", ["find", "/dev/zero", "-type", "f", "-print", 
"-quit"], 0x7ffc1e9c8578 /* 72 vars */) = 0
    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or 
directory)
    openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", 
O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre2-8.so.0", 
O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", 
O_RDONLY|O_CLOEXEC) = 3
    statfs("/sys/fs/selinux", 0x7ffd464f5210) = -1 ENOENT (No such file or 
directory)
    statfs("/selinux", 0x7ffd464f5210)      = -1 ENOENT (No such file or 
directory)
    openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
    access("/etc/selinux/config", F_OK)     = -1 ENOENT (No such file or 
directory)
    openat(AT_FDCWD, ".", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/share/locale/en_AU.UTF-8/LC_MESSAGES/findutils.mo", 
O_RDONLY) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/en_AU.utf8/LC_MESSAGES/findutils.mo", 
O_RDONLY) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/en_AU/LC_MESSAGES/findutils.mo", 
O_RDONLY) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/findutils.mo", 
O_RDONLY) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/findutils.mo", 
O_RDONLY) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/findutils.mo", O_RDONLY) 
= -1 ENOENT (No such file or directory)
    newfstatat(AT_FDCWD, "/dev/zero", {st_mode=S_IFCHR|0666, 
st_rdev=makedev(0x1, 0x5), ...}, AT_SYMLINK_NOFOLLOW) = 0
    +++ exited with 0 +++

Here is some basic investigation inside mmdebstrap:

    bash5$ mmdebstrap bullseye /dev/null --customize-hook='chroot $1 bash; 
false' --include=strace,findutils
    I: automatically chosen mode: unshare
    I: chroot architecture amd64 is equal to the host's architecture
    I: automatically chosen format: tar
    I: using /tmp/mmdebstrap.PqOlBcBbIw as tempdir
    I: running apt-get update...
    done
    I: downloading packages with apt...
    done
    I: extracting archives...
    done
    I: installing essential packages...
    done
    I: downloading apt...
    done
    I: installing apt...
    done
    I: installing remaining packages inside the chroot...
    done
    done
    I: running --customize-hook in shell: sh -c 'chroot $1 bash; false' exec 
/tmp/mmdebstrap.PqOlBcBbIw

    root@hera:/# find /dev/ -type f
    /dev/zero
    /dev/urandom
    /dev/tty
    /dev/random
    /dev/ptmx
    /dev/null
    /dev/full
    /dev/console

    root@hera:/# strace -e trace=file find /dev/zero -type f -print -quit
    execve("/usr/bin/find", ["find", "/dev/zero", "-type", "f", "-print", 
"-quit"], 0x7fff5a33ba68 /* 79 vars */) = 0
    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or 
directory)
    openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", 
O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libpcre2-8.so.0", 
O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", 
O_RDONLY|O_CLOEXEC) = 3
    statfs("/sys/fs/selinux", 0x7ffe4aac8df0) = -1 ENOENT (No such file or 
directory)
    statfs("/selinux", 0x7ffe4aac8df0)      = -1 ENOENT (No such file or 
directory)
    openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
    access("/etc/selinux/config", F_OK)     = -1 ENOENT (No such file or 
directory)
    openat(AT_FDCWD, ".", O_RDONLY|O_CLOEXEC) = 3
    openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 
ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = -1 
ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_IDENTIFICATION", 
O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", 
O_RDONLY) = 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_MEASUREMENT", 
O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_TELEPHONE", 
O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_ADDRESS", O_RDONLY|O_CLOEXEC) 
= 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_NAME", O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_PAPER", O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_MESSAGES", O_RDONLY|O_CLOEXEC) 
= 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_MESSAGES/SYS_LC_MESSAGES", 
O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_MONETARY", O_RDONLY|O_CLOEXEC) 
= 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_COLLATE", O_RDONLY|O_CLOEXEC) 
= 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_TIME", O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) 
= 4
    openat(AT_FDCWD, "/usr/lib/locale/C.UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = 4
    openat(AT_FDCWD, "/usr/share/locale/C.UTF-8/LC_MESSAGES/findutils.mo", 
O_RDONLY) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/C.utf8/LC_MESSAGES/findutils.mo", 
O_RDONLY) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/C/LC_MESSAGES/findutils.mo", O_RDONLY) 
= -1 ENOENT (No such file or directory)
    newfstatat(AT_FDCWD, "/dev/zero", {st_mode=S_IFCHR|0666, 
st_rdev=makedev(0x1, 0x5), ...}, AT_SYMLINK_NOFOLLOW) = 0
    +++ exited with 0 +++

    root@hera:/# stat /dev/zero
      File: /dev/zero
      Size: 0           Blocks: 0          IO Block: 4096   character special 
file
    Device: 5h/5d       Inode: 6           Links: 1     Device type: 1,5
    Access: (0666/crw-rw-rw-)  Uid: (65534/  nobody)   Gid: (65534/ nogroup)
    Access: 2022-03-25 00:22:02.702830832 +0000
    Modify: 2022-03-25 00:22:02.702830832 +0000
    Change: 2022-03-25 00:22:02.702830832 +0000
     Birth: -

    root@hera:/# if builtin test -f /dev/zero; then echo IS REGULAR; else echo 
NOT REGULAR; fi
    NOT REGULAR

    root@hera:/# apt install python3 -qq
    ⋮

    root@hera:/# python3 -c 'import pathlib; 
print(pathlib.Path("/dev/zero").stat())'
    os.stat_result(st_mode=8630, st_ino=6, st_dev=5, st_nlink=1, st_uid=65534, 
st_gid=65534, st_size=0, st_atime=1648167722, st_mtime=1648167722, 
st_ctime=1648167722)

    root@hera:/# python3 -c 'import pathlib; 
print(pathlib.Path("/dev/zero").is_file())'
    False

Oh also... SOME character devices are correctly detected.

    bash$ mmdebstrap --aptopt='Acquire::http::Proxy "http://localhost:3142";' 
--dpkgopt=force-unsafe-io --variant=apt bullseye /dev/null 
--customize-hook='chroot $1 bash; false' --include=strace,findutils
    ⋮

    root@hera:/# find /dev -type b -ls

    root@hera:/# find /dev -type c -ls
           14      0 crw--w----   1 nobody   nogroup  136,  11 Mar 25 04:10 
/dev/pts/11
           13      0 crw--w----   1 nobody   nogroup  136,  10 Mar 25 04:05 
/dev/pts/10
           12      0 crw--w----   1 nobody   nogroup  136,   9 Mar 25 04:11 
/dev/pts/9
           10      0 crw--w----   1 nobody   nogroup  136,   7 Mar 25 04:12 
/dev/pts/7
            9      0 crw--w----   1 nobody   nogroup  136,   6 Mar 25 04:12 
/dev/pts/6
            6      0 crw--w----   1 nobody   nogroup  136,   3 Mar 25 03:44 
/dev/pts/3
            8      0 crw--w----   1 nobody   nogroup  136,   5 Mar 25 03:38 
/dev/pts/5
            7      0 crw--w----   1 nobody   nogroup  136,   4 Mar 25 04:12 
/dev/pts/4
            5      0 crw--w----   1 nobody   nogroup  136,   2 Mar 25 03:42 
/dev/pts/2
            4      0 crw--w----   1 nobody   nogroup  136,   1 Mar 25 04:12 
/dev/pts/1
            3      0 crw-------   1 nobody   nogroup  136,   0 Mar 25 04:12 
/dev/pts/0
            2      0 c---------   1 nobody   nogroup    5,   2 Mar 25 00:21 
/dev/pts/ptmx

    root@hera:/# find /dev -type f -ls
            6      0 crw-rw-rw-   1 nobody   nogroup    1,   5 Mar 25 00:22 
/dev/zero
            9      0 crw-rw-rw-   1 nobody   nogroup    1,   9 Mar 25 00:22 
/dev/urandom
           11      0 crw-rw-rw-   1 nobody   nogroup    5,   0 Mar 25 04:11 
/dev/tty
            8      0 crw-rw-rw-   1 nobody   nogroup    1,   8 Mar 25 00:22 
/dev/random
           86      0 crw-rw-rw-   1 nobody   nogroup    5,   2 Mar 25 04:12 
/dev/ptmx
            4      0 crw-rw-rw-   1 nobody   nogroup    1,   3 Mar 25 00:22 
/dev/null
            7      0 crw-rw-rw-   1 nobody   nogroup    1,   7 Mar 25 00:22 
/dev/full
           12      0 crw-------   1 nobody   nogroup    5,   1 Mar 25 00:22 
/dev/console



-- System Information:
Debian Release: 11.2
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 
'proposed-updates'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 5.14.0-0.bpo.2-amd64 (SMP w/8 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, 
TAINT_UNSIGNED_MODULE
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages mmdebstrap depends on:
ii  apt      2.2.4
ii  perl     5.32.1-4+deb11u2
ii  python3  3.9.2-3

Versions of packages mmdebstrap recommends:
ii  arch-test            0.17-1
ii  fakechroot           2.19-3.3
ii  fakeroot             1.25.3-1.1
ii  gpg                  2.2.27-2
ii  libdistro-info-perl  1.0
ii  mount                2.36.1-8+deb11u1
ii  uidmap               1:4.8.1-1

Versions of packages mmdebstrap suggests:
ii  apt [apt-transport-https]  2.2.4
pn  apt-transport-tor          <none>
pn  apt-utils                  <none>
ii  binfmt-support             2.2.1-1
ii  ca-certificates            20210119
ii  debootstrap                1.0.123
ii  distro-info-data           0.51+deb11u1
ii  dpkg-dev                   1.20.9
ii  perl-doc                   5.32.1-4+deb11u2
pn  proot                      <none>
ii  qemu-user                  1:5.2+dfsg-11+deb11u1
ii  qemu-user-static           1:5.2+dfsg-11+deb11u1
ii  squashfs-tools-ng          1.0.4-1

-- no debconf information

Reply via email to