Azat Khuzhin
20a671b8cf
Skip protection from double decompression if inode from maps cannot be obtained
...
Under some circumstances, like using qemu-$ARCH-static, /proc/self/maps
will not contain information about /proc/self/exe.
Well, strictly speaking it does contains, however qemu will not pass it
to the user program:
<details>
<summary>strace</summary>
$ sudo strace -s10000 -f arch-chroot . /qemu-riscv64-static /clickhouse
...
execve("/qemu-riscv64-static", ["/qemu-riscv64-static", "/clickhouse"], 0x7fffffffe458 /* 20 vars */) = 0
readlinkat(AT_FDCWD, "/proc/self/exe", "/qemu-riscv64-static", 4096) = 20
openat(AT_FDCWD, "/proc/self/maps", O_RDONLY|O_CLOEXEC) = 4
[pid 3126] read(4, "00010000-00111000 r--p 00000000 fe:01 30312571 /clickhouse\n00111000-00119000 r--p 00100000 fe:01 30312571 /clickhouse\n00119000-0011a000 rw-p 00108000 fe:01 30312571 /clickhouse\n0011a000-0013d000 rw-p 00000000 00:00 0 \n4000000000-4000001000 ---p 00000000 00:00 0 \n4000001000-4000801000 rw-p 00000000 00:00 0 \n4000801000-400081a000 r--p 00000000 fe:01 30316932 /lib/riscv64-linux-gnu/ld-2.32.so\n400081a000-400081b000 ---p 00000000 00:00 0 \n400081b000-400081c000 r--p 00019000 fe:01 30316932 /lib/riscv64-linux-gnu/ld-2.32.so\n400081c000-400081e000 rw-p 0001a000 fe:01 30316932 /lib/riscv64-linux-gnu/ld-2.32.so\n400081e000-400081f000 r--p 00000000 00:00 0 \n400081f000-4000922000 r--p 00000000 fe:01 30316935 /lib/riscv64-linux-gnu/libc-2.32.so\n4000922000-4000926000 r--p 00102000 fe:01 30316935 /lib/riscv64-linux-gnu/libc-2.32.so\n4000926000-4000928000 rw-p 00106000 fe:01 30316935 /lib/riscv64-linux-gnu/libc-2.32.so\n4000928000-400092d000 rw-p 00000000 00:00 0 \n400092d000-40009af000 r--p 00000000 fe:01 30316943 /lib/riscv64-linux-gnu/libm-2.32.so\n40009af000-40009b0000 r--p 00081000 fe:01 30316943 /lib/riscv64-linux-gnu/libm-2.32.so\n40009b0000-40009b1000 rw-p 00082000 fe:01 30316943 /lib/riscv64-linux-gnu/libm-2.32.so\n40009b1000-40009c5000 r--p 00000000 fe:01 30316946 /lib/riscv64-linux-gnu/libpthread-2.32.so\n40009c5000-40009c6000 r--p 00013000 fe:01 30316946 /lib/riscv64-linux-gnu/libpthread-2.32.so\n40009c6000-40009c7000 rw-p 00014000 fe:01 30316946 /lib/riscv64-linux-gnu/libpthread-2.32.so\n40009c7000-40009cb000 rw-p 00000000 00:00 0 \n40009cb000-40009cd000 r--p 00000000 fe:01 30316939 /lib/riscv64-linux-gnu/libdl-2.32.so\n40009cd000-40009ce000 r--p 00001000 fe:01 30316939 /lib/riscv64-linux-gnu/libdl-2.32.so\n40009ce000-40009cf000 rw-p 00002000 fe:01 30316939 /lib/riscv64-linux-gnu/libdl-2.32.so\n40009cf000-40009d1000 rw-p 00000000 00:00 0 \n7fffe8000000-7fffeffff000 rwxp 00000000 00:00 0 \n7fffeffff000-7ffff0000000 ---p 00000000 00:00 0 \n7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0 \n7ffff0021000-7ffff4000000 ---p 00000000 00:00 0 \n7ffff6b4b000-7ffff6b5b000 rw-p 00000000 00:00 0 \n7ffff71ff000-7ffff7200000 ---p 00000000 00:00 0 \n7ffff7200000-7ffff7a00000 rw-p 00000000 00:00 0\n7ffff7a00000-7ffff7a3c000 r--p 00000000 fe:01 30316953 /qemu-riscv64-static\n7ffff7a3c000-7ffff7c74000 r-xp 0003c000 fe:01 30316953 /qemu-riscv64-static\n7ffff7c74000-7ffff7d77000 r--p 00274000 fe:01 30316953 /qemu-riscv64-static\n7ffff7d77000-7ffff7dce000 r--p 00377000 fe:01 30316953 /qemu-riscv64-static\n7ffff7dce000-7ffff7df7000 rw-p 003ce000 fe:01 30316953 /qemu-riscv64-static\n7ffff7df7000-7ffff7e0c000 rw-p 00000000 00:00 0 [heap]\n7ffff7e0c000-7ffff7e70000 rw-p 00000000 00:00 0 [heap]\n7ffff7f42000-7ffff7ff9000 rw-p 00000000 00:00 0 \n7ffff7ff9000-7ffff7ffd000 r--p 00000000 00:00 0 [vvar]\n7ffff7ffd000-7ffff7fff000 r-xp 00000000 00:00 0 [vdso]\n7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0 [stack]\nffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]\n", 4096) = 3608
[pid 3126] read(4, "", 1024) = 0
[pid 3126] close(4) = 0
[pid 3126] write(3, "10000-111000 r-xp 00000000 fe:01 30312571", 41) = 41
[pid 3126] write(3, " /clickhouse\n", 44) = 44
[pid 3126] write(3, "111000-119000 r--p 00100000 fe:01 30312571", 42) = 42
[pid 3126] write(3, " /clickhouse\n", 43) = 43
[pid 3126] write(3, "119000-11a000 rw-p 00108000 fe:01 30312571", 42) = 42
[pid 3126] write(3, " /clickhouse\n", 43) = 43
[pid 3126] write(3, "11a000-13d000 rw-p 00000000 00:00 0", 35) = 35
[pid 3126] write(3, " \n", 39) = 39
[pid 3126] write(3, "4000000000-4000001000 ---p 00000000 00:00 0", 43) = 43
[pid 3126] write(3, " \n", 31) = 31
[pid 3126] write(3, "4000001000-4000801000 rw-p 00000000 00:00 0", 43) = 43
[pid 3126] write(3, " [stack]\n", 38) = 38
[pid 3126] write(3, "4000801000-400081a000 r-xp 00000000 fe:01 30316932", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/ld-2.32.so\n", 57 <unfinished ...>
[pid 3127] <... clock_nanosleep resumed>0x7ffff79ff060) = 0
[pid 3126] <... write resumed>) = 57
[pid 3127] clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=10000000}, <unfinished ...>
[pid 3126] write(3, "400081a000-400081b000 ---p 00000000 00:00 0", 43) = 43
[pid 3126] write(3, " \n", 31) = 31
[pid 3126] write(3, "400081b000-400081c000 r--p 00019000 fe:01 30316932", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/ld-2.32.so\n", 57) = 57
[pid 3126] write(3, "400081c000-400081e000 rw-p 0001a000 fe:01 30316932", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/ld-2.32.so\n", 57) = 57
[pid 3126] write(3, "400081e000-400081f000 r-xp 00000000 00:00 0", 43) = 43
[pid 3126] write(3, " \n", 31) = 31
[pid 3126] write(3, "400081f000-4000922000 r-xp 00000000 fe:01 30316935", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libc-2.32.so\n", 59) = 59
[pid 3126] write(3, "4000922000-4000926000 r--p 00102000 fe:01 30316935", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libc-2.32.so\n", 59) = 59
[pid 3126] write(3, "4000926000-4000928000 rw-p 00106000 fe:01 30316935", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libc-2.32.so\n", 59) = 59
[pid 3126] write(3, "4000928000-400092d000 rw-p 00000000 00:00 0", 43) = 43
[pid 3126] write(3, " \n", 31) = 31
[pid 3126] write(3, "400092d000-40009af000 r-xp 00000000 fe:01 30316943", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libm-2.32.so\n", 59) = 59
[pid 3126] write(3, "40009af000-40009b0000 r--p 00081000 fe:01 30316943", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libm-2.32.so\n", 59) = 59
[pid 3126] write(3, "40009b0000-40009b1000 rw-p 00082000 fe:01 30316943", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libm-2.32.so\n", 59) = 59
[pid 3126] write(3, "40009b1000-40009c5000 r-xp 00000000 fe:01 30316946", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libpthread-2.32.so\n", 65) = 65
[pid 3126] write(3, "40009c5000-40009c6000 r--p 00013000 fe:01 30316946", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libpthread-2.32.so\n", 65) = 65
[pid 3126] write(3, "40009c6000-40009c7000 rw-p 00014000 fe:01 30316946", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libpthread-2.32.so\n", 65) = 65
[pid 3126] write(3, "40009c7000-40009cb000 rw-p 00000000 00:00 0", 43) = 43
[pid 3126] write(3, " \n", 31) = 31
[pid 3126] write(3, "40009cb000-40009cd000 r-xp 00000000 fe:01 30316939", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libdl-2.32.so\n", 60) = 60
[pid 3126] write(3, "40009cd000-40009ce000 r--p 00001000 fe:01 30316939", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libdl-2.32.so\n", 60) = 60
[pid 3126] write(3, "40009ce000-40009cf000 rw-p 00002000 fe:01 30316939", 50) = 50
[pid 3126] write(3, " /lib/riscv64-linux-gnu/libdl-2.32.so\n", 60) = 60
[pid 3126] write(3, "40009cf000-40009d1000 rw-p 00000000 00:00 0", 43) = 43
[pid 3126] write(3, " \n", 31) = 31
</details>
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
2023-07-16 08:17:14 +02:00