| 1 | mkfifoat() is available in Android only after API 23. We can't use tar's |
| 2 | implementation of mkfifioat() since it will use tar's implementation of |
| 3 | mknodat(). This will cause infinite recursion in file gnu/at-func.c and |
| 4 | segfault. |
| 5 | |
| 6 | Snippet of backtrace: |
| 7 | .... |
| 8 | #9 0x000000555559819c in mknodat (fd=-100, file=0x7fb7c90050 "sda", mode=25008, dev=2048) at /home/builder/.termux-build/tar/src/gnu/at-func.c:75 |
| 9 | #10 0x000000555559819c in mknodat (fd=-100, file=0x7fb7c90050 "sda", mode=25008, dev=2048) at /home/builder/.termux-build/tar/src/gnu/at-func.c:75 |
| 10 | #11 0x000000555559819c in mknodat (fd=-100, file=0x7fb7c90050 "sda", mode=25008, dev=2048) at /home/builder/.termux-build/tar/src/gnu/at-func.c:75 |
| 11 | #12 0x000000555559819c in mknodat (fd=-100, file=0x7fb7c90050 "sda", mode=25008, dev=2048) at /home/builder/.termux-build/tar/src/gnu/at-func.c:75 |
| 12 | #13 0x000000555556a9d4 in extract_node (file_name=0x7fb7c90050 "sda", typeflag=52) at /home/builder/.termux-build/tar/src/src/extract.c:1447 |
| 13 | #14 0x0000005555568f38 in extract_archive () at /home/builder/.termux-build/tar/src/src/extract.c:1709 |
| 14 | .... |
| 15 | |
| 16 | diff -uNr tar-1.30/src/extract.c tar-1.30.mod/src/extract.c |
| 17 | --- tar-1.30/src/extract.c 2017-12-16 23:23:12.000000000 +0200 |
| 18 | +++ tar-1.30.mod/src/extract.c 2017-12-25 14:31:31.541886176 +0200 |
| 19 | @@ -42,6 +42,11 @@ |
| 20 | # define fchown(fd, uid, gid) (errno = ENOSYS, -1) |
| 21 | #endif |
| 22 | |
| 23 | +static int |
| 24 | +mkfifoat(int fd, const char* path, mode_t mode) { |
| 25 | + return mknodat(fd, path, (mode & ~S_IFMT) | S_IFIFO, 0); |
| 26 | +} |
| 27 | + |
| 28 | /* Return true if an error number ERR means the system call is |
| 29 | supported in this case. */ |
| 30 | static bool |