Package: libuv1 Version: 1.20.3 Tags: patch libuv1 calls readlink() with buffer size zero for /proc/self due to downstream patch 'path_max'.
This breaks a nodejs test-case on chroot, containers, and s390x (in Ubuntu at least), on which /dev/stdin is a symlink pointing to /proc/self/fd/0. On sid chroot: # apt-get update # apt-get install nodejs strace # apt-get source nodejs # cd nodejs-* The /dev/stdin device is a symlink to /proc/self/... # ls -l /dev/stdin lrwxrwxrwx 1 root root 15 Sep 14 13:40 /dev/stdin -> /proc/self/fd/0 The lstat() call reports 'st_size' of zero for /proc/self: # strace -e lstat \ stat /proc/self \ 2>&1 | grep -e lstat -e File: -e Size: lstat("/proc/self", {st_mode=S_IFLNK|0777, st_size=0, ...}) = 0 File: /proc/self -> 15804 Size: 0 Blocks: 0 IO Block: 1024 symbolic link This causes libuv1 to call readlink() with a buffer size of zero, and hit EINVAL: # strace -f -e lstat,readlink \ node test/parallel/test-fs-realpath-pipe.js [pid 15906] lstat("/dev", {st_mode=S_IFDIR|0755, st_size=3780, ...}) = 0 [pid 15907] lstat("/dev/stdin", {st_mode=S_IFLNK|0777, st_size=15, ...}) = 0 [pid 15909] lstat("/dev/stdin", {st_mode=S_IFLNK|0777, st_size=15, ...}) = 0 [pid 15909] readlink("/dev/stdin", "/proc/self/fd/0", 15) = 15 [pid 15906] lstat("/proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 [pid 15907] lstat("/proc/self", {st_mode=S_IFLNK|0777, st_size=0, ...}) = 0 [pid 15909] lstat("/proc/self", {st_mode=S_IFLNK|0777, st_size=0, ...}) = 0 [pid 15909] readlink("/proc/self", 0x7ffa38000b40, 0) = -1 EINVAL (Invalid argument) With this patch applied, the call to readlink() has a non-zero buffer size and returns correctly: # dpkg -i libuv1_1.23.0-1+fixpathmax1_amd64.deb # strace -f -e lstat,readlink \ node test/parallel/test-fs-realpath-pipe.js [pid 31068] lstat("/dev", {st_mode=S_IFDIR|0755, st_size=3780, ...}) = 0 [pid 31068] lstat("/dev/stdin", {st_mode=S_IFLNK|0777, st_size=15, ...}) = 0 [pid 31068] lstat("/dev/stdin", {st_mode=S_IFLNK|0777, st_size=15, ...}) = 0 [pid 31068] readlink("/dev/stdin", "/proc/self/fd/0", 15) = 15 [pid 31068] lstat("/proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 [pid 31068] lstat("/proc/self", {st_mode=S_IFLNK|0777, st_size=0, ...}) = 0 [pid 31068] lstat("/proc/self", {st_mode=S_IFLNK|0777, st_size=0, ...}) = 0 [pid 31068] readlink("/proc/self", "31068", 256) = 5 [pid 31068] lstat("/proc/31068", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 [pid 31068] lstat("/proc/31068/fd", {st_mode=S_IFDIR|0500, st_size=0, ...}) = 0 [pid 31068] lstat("/proc/31068/fd/0", {st_mode=S_IFLNK|0700, st_size=64, ...}) = 0 [pid 31068] lstat("/proc/31068/fd/0", {st_mode=S_IFLNK|0700, st_size=64, ...}) = 0 [pid 31068] readlink("/proc/31068/fd/0", "socket:[266186]", 64) = 15 Thanks, -- Mauricio Faria de Oliveira
sid-libuv1-path_max_zero_st_size.debdiff
Description: Binary data