From a75175fe9436e76103d23c2c44e299f3680901e3 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sat, 8 Jul 2023 06:58:21 -0700 Subject: [PATCH] Make build hermetically sealed again It turned out that Landlock Make hasn't been applying sandboxing for a while, due to a mistyped if statement for `$(USE_SYSTEM_TOOLCHAIN)` it should have had the opposite meaning. Regressions in the build configs have been fixed. The rmrf() function works better now. The rm.com tool works according to POSIX with the exception of supporting prompts. --- Makefile | 7 +- ape/ape.mk | 2 + build/bootstrap/rm.com | Bin 86016 -> 61904 bytes libc/calls/remove.c | 7 +- libc/nexgen32e/nexgen32e.mk | 4 +- libc/x/rmrf.c | 66 +++++------------ libc/x/x.mk | 1 + test/libc/runtime/grow_test.c | 2 + test/libc/thread/pthread_setname_np_test.c | 1 + third_party/musl/ftw.c | 12 ++- third_party/musl/ftw.h | 74 +++++++++++++++++-- third_party/musl/nftw.c | 36 +++++---- tool/build/rm.c | 81 +++++++++++++++++---- tool/scripts/cosmoc++ | 2 +- 14 files changed, 202 insertions(+), 93 deletions(-) diff --git a/Makefile b/Makefile index 1701a83c3..d0d2ab986 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ o/$(MODE): \ o/$(MODE)/examples \ o/$(MODE)/third_party -ifneq ($(USE_SYSTEM_TOOLCHAIN),) +ifeq ($(USE_SYSTEM_TOOLCHAIN),) .STRICT = 1 endif @@ -100,6 +100,7 @@ endif r:build/portcosmo.h \ /proc/stat \ rw:/dev/null \ + rw:/dev/full \ w:o/stack.log \ /etc/hosts \ ~/.runit.psk \ @@ -148,13 +149,13 @@ include libc/log/log.mk # │ include third_party/getopt/getopt.mk # │ include third_party/bzip2/bzip2.mk # │ include dsp/core/core.mk # │ +include third_party/musl/musl.mk # │ include libc/x/x.mk # │ include third_party/stb/stb.mk # │ include dsp/scale/scale.mk # │ include dsp/mpeg/mpeg.mk # │ include dsp/dsp.mk # │ include third_party/zlib/gz/gz.mk # │ -include third_party/musl/musl.mk # │ include third_party/intel/intel.mk # │ include third_party/aarch64/aarch64.mk # │ include libc/libc.mk #─┘ @@ -436,7 +437,7 @@ aarch64: $(MAKE) m=aarch64 clean: - rm -rf o + $(RM) -r o # UNSPECIFIED PREREQUISITES TUTORIAL # diff --git a/ape/ape.mk b/ape/ape.mk index 60c52d8b2..5d575aa38 100644 --- a/ape/ape.mk +++ b/ape/ape.mk @@ -129,6 +129,7 @@ o/$(MODE)/ape/ape-no-modify-self.o: \ ape/ape.internal.h \ libc/dce.h \ libc/elf/def.h \ + libc/thread/tls.h \ libc/intrin/asancodes.h \ libc/macho.internal.h \ libc/macros.internal.h \ @@ -158,6 +159,7 @@ o/$(MODE)/ape/ape-copy-self.o: \ ape/ape.internal.h \ libc/dce.h \ libc/elf/def.h \ + libc/thread/tls.h \ libc/intrin/asancodes.h \ libc/macho.internal.h \ libc/macros.internal.h \ diff --git a/build/bootstrap/rm.com b/build/bootstrap/rm.com index be89f8c0f52cc2b5355d1b526b9b9d8d1987026d..c1a311f3f3868f2e0a32b03ec98108a9963716d9 100755 GIT binary patch literal 61904 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 diff --git a/libc/calls/remove.c b/libc/calls/remove.c index 256adff3a..029b77bb4 100644 --- a/libc/calls/remove.c +++ b/libc/calls/remove.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/errno.h" +#include "libc/sysv/consts/at.h" /** * Deletes "file" or empty directory associtaed with name. @@ -26,5 +27,9 @@ * @see unlink() and rmdir() which this abstracts */ int remove(const char *name) { - return unlink(name) != -1 || (errno == EISDIR && rmdir(name) != -1) ? 0 : -1; + int e = errno; + if (!unlinkat(AT_FDCWD, name, 0)) return 0; + if (errno != EISDIR) return -1; + errno = e; + return unlinkat(AT_FDCWD, name, AT_REMOVEDIR); } diff --git a/libc/nexgen32e/nexgen32e.mk b/libc/nexgen32e/nexgen32e.mk index c7f9cd69d..b37bfb6f0 100644 --- a/libc/nexgen32e/nexgen32e.mk +++ b/libc/nexgen32e/nexgen32e.mk @@ -85,9 +85,9 @@ o/$(MODE)/libc/nexgen32e/gclongjmp.o: libc/nexgen32e/gclongjmp.S @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< o/$(MODE)/libc/nexgen32e/checkstackalign.o: libc/nexgen32e/checkstackalign.S @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< -o/$(MODE)/libc/nexgen32e/blink_xnu_aarch64.o: libc/nexgen32e/blink_xnu_aarch64.S +o/$(MODE)/libc/nexgen32e/blink_xnu_aarch64.o: libc/nexgen32e/blink_xnu_aarch64.S ape/blink-xnu-aarch64.gz @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< -o/$(MODE)/libc/nexgen32e/blink_linux_aarch64.o: libc/nexgen32e/blink_linux_aarch64.S +o/$(MODE)/libc/nexgen32e/blink_linux_aarch64.o: libc/nexgen32e/blink_linux_aarch64.S ape/blink-linux-aarch64.gz @$(COMPILE) -AOBJECTIFY.S $(OBJECTIFY.S) $(OUTPUT_OPTION) -c $< LIBC_NEXGEN32E_LIBS = $(foreach x,$(LIBC_NEXGEN32E_ARTIFACTS),$($(x))) diff --git a/libc/x/rmrf.c b/libc/x/rmrf.c index b59560e53..505998e9b 100644 --- a/libc/x/rmrf.c +++ b/libc/x/rmrf.c @@ -16,66 +16,38 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/assert.h" #include "libc/calls/calls.h" -#include "libc/calls/struct/dirent.h" -#include "libc/calls/struct/stat.h" #include "libc/errno.h" -#include "libc/mem/mem.h" -#include "libc/runtime/runtime.h" -#include "libc/stdio/stdio.h" -#include "libc/str/str.h" -#include "libc/sysv/consts/dt.h" -#include "libc/sysv/consts/s.h" +#include "libc/sysv/errfuns.h" #include "libc/x/x.h" +#include "third_party/musl/ftw.h" -static int rmrfdir(const char *dirpath) { +static int rmrf_callback(const char *fpath, // + const struct stat *st, // + int typeflag, // + struct FTW *ftwbuf) { // int rc; - DIR *d; - char *path; - struct dirent *e; - if (!(d = opendir(dirpath))) return -1; - while ((e = readdir(d))) { - if (!strcmp(e->d_name, ".")) continue; - if (!strcmp(e->d_name, "..")) continue; - _npassert(!strchr(e->d_name, '/')); - path = xjoinpaths(dirpath, e->d_name); - if (e->d_type == DT_DIR) { - rc = rmrfdir(path); - } else { - rc = unlink(path); - } - free(path); - if (rc == -1) { - closedir(d); - return -1; + if (typeflag == FTW_DNR) { + if (!(rc = chmod(fpath, 0700))) { + return nftw(fpath, rmrf_callback, 128 - ftwbuf->level, + FTW_PHYS | FTW_DEPTH); } + } else if (typeflag == FTW_DP) { + rc = rmdir(fpath); + } else { + rc = unlink(fpath); + } + if (rc == -1 && errno == ENOENT) { + rc = 0; } - rc = closedir(d); - rc |= rmdir(dirpath); return rc; } /** * Recursively removes file or directory. - * * @return 0 on success, or -1 w/ errno */ int rmrf(const char *path) { - int e; - struct stat st; - e = errno; - if (stat(path, &st) == -1) { - if (errno == ENOENT) { - errno = e; - return 0; - } else { - return -1; - } - } - if (!S_ISDIR(st.st_mode)) { - return unlink(path); - } else { - return rmrfdir(path); - } + if (path[0] == '/' && !path[1]) return enotsup(); + return nftw(path, rmrf_callback, 128, FTW_PHYS | FTW_DEPTH); } diff --git a/libc/x/x.mk b/libc/x/x.mk index 0d23edf8a..e1e814269 100644 --- a/libc/x/x.mk +++ b/libc/x/x.mk @@ -35,6 +35,7 @@ LIBC_X_A_DIRECTDEPS = \ LIBC_STR \ LIBC_SYSV \ THIRD_PARTY_GDTOA \ + THIRD_PARTY_MUSL \ THIRD_PARTY_ZLIB LIBC_X_A_DEPS := \ diff --git a/test/libc/runtime/grow_test.c b/test/libc/runtime/grow_test.c index e50565d58..a3a2338bc 100644 --- a/test/libc/runtime/grow_test.c +++ b/test/libc/runtime/grow_test.c @@ -27,6 +27,8 @@ #include "libc/str/str.h" #include "libc/testlib/testlib.h" +STATIC_YOINK("realloc"); + TEST(grow, testNull_hasAllocatingBehavior) { void *p = NULL; size_t capacity = 0; diff --git a/test/libc/thread/pthread_setname_np_test.c b/test/libc/thread/pthread_setname_np_test.c index d4744351a..08903c1a4 100644 --- a/test/libc/thread/pthread_setname_np_test.c +++ b/test/libc/thread/pthread_setname_np_test.c @@ -101,6 +101,7 @@ TEST(pthread_setname_np, GetNameOfOtherThread) { while (!atomic_load(&sync1)) pthread_yield(); errno_t e = pthread_getname_np(id, me, sizeof(me)); if (IsLinux() && e == ENOENT) return; // bah old kernel + if (IsLinux() && e == EACCES) return; // meh landlock ASSERT_EQ(0, e); EXPECT_STREQ("justine", me); ASSERT_EQ(0, pthread_setname_np(id, "tunney")); diff --git a/third_party/musl/ftw.c b/third_party/musl/ftw.c index f3f174117..d92f3f8fb 100644 --- a/third_party/musl/ftw.c +++ b/third_party/musl/ftw.c @@ -31,19 +31,23 @@ asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ Copyright 2005-2014 Rich Felker, et. al.\""); asm(".include \"libc/disclaimer.inc\""); - -/* clang-format off */ +// clang-format off /** * Walks file tree. * + * @return 0 on success, -1 on error, or non-zero `fn` result * @see examples/walk.c for example * @see nftw() */ -int ftw(const char *path, int (*fn)(const char *, const struct stat *, int), int fd_limit) +int ftw(const char *dirpath, + int fn(const char *fpath, + const struct stat *st, + int typeflag), + int fd_limit) { /* The following cast assumes that calling a function with one * argument more than it needs behaves as expected. This is * actually undefined, but works on all real-world machines. */ - return nftw(path, (int (*)())fn, fd_limit, FTW_PHYS); + return nftw(dirpath, (int (*)())fn, fd_limit, FTW_PHYS); } diff --git a/third_party/musl/ftw.h b/third_party/musl/ftw.h index 1346a4cd6..91eaf0267 100644 --- a/third_party/musl/ftw.h +++ b/third_party/musl/ftw.h @@ -4,21 +4,79 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -#define FTW_F 1 /* file */ -#define FTW_D 2 /* directory */ -#define FTW_DNR 3 /* directory that cannot be read */ -#define FTW_NS 4 /* not a symbolic link and stat failed */ -#define FTW_SL 5 /* symbolic link */ -#define FTW_DP 6 /* directory and FTW_DEPTH was specified */ -#define FTW_SLN 7 /* symbolic link pointing to nonexistent file */ +/** + * Type for file. + */ +#define FTW_F 1 -#define FTW_PHYS 1 +/** + * Type for directory. + */ +#define FTW_D 2 + +/** + * Type for directory that cannot be read. + */ +#define FTW_DNR 3 + +/** + * Type for stat() failed and not a symbolic link. + */ +#define FTW_NS 4 + +/** + * Type for symbolic link when `FTW_PHYS` is in flags. + */ +#define FTW_SL 5 + +/** + * Directory and `FTW_DEPTH` in flags. + */ +#define FTW_DP 6 + +/** + * Type for broken symbolic link when `FTW_PHYS` is not in flags. + */ +#define FTW_SLN 7 + +/** + * Flag to prevent following symbolic links (recommended). + * @see nftw() flags + */ +#define FTW_PHYS 1 + +/** + * Flag to prevent crossing mount points. + * @see nftw() flags + */ #define FTW_MOUNT 2 + +/** + * Unsupported. + * @see nftw() flags + */ #define FTW_CHDIR 4 + +/** + * Flag for post-order traversal. + * + * 1. Will use `FTW_DP` instead of `FTW_D` as type. + * 2. Directory callback happens *after* rather than before. + * + * @see nftw() flags + */ #define FTW_DEPTH 8 struct FTW { + + /** + * Byte offset of basename component in `fpath` passed to callback. + */ int base; + + /** + * Depth relative to `dirpath` whose level is zero. + */ int level; }; diff --git a/third_party/musl/nftw.c b/third_party/musl/nftw.c index 48145e705..992478279 100644 --- a/third_party/musl/nftw.c +++ b/third_party/musl/nftw.c @@ -35,17 +35,13 @@ #include "libc/thread/thread.h" #include "third_party/musl/ftw.h" +#define PATH_MAXIMUS 4096 + asm(".ident\t\"\\n\\n\ Musl libc (MIT License)\\n\ Copyright 2005-2014 Rich Felker, et. al.\""); asm(".include \"libc/disclaimer.inc\""); - -/* no reason to impose windows limit - small enough to fit in stack frame - should be changed to use realloc */ -#define PATH_MAX2 2048 - -/* clang-format off */ +// clang-format off struct history { @@ -56,7 +52,11 @@ struct history int base; }; -static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags, struct history *h) +static int do_nftw(char *path, + int fn(const char *, const struct stat *, int, struct FTW *), + int fd_limit, + int flags, + struct history *h) { size_t l = strlen(path), j = l && path[l-1]=='/' ? l-1 : l; struct stat st; @@ -128,7 +128,7 @@ static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, && (!de->d_name[1] || (de->d_name[1]=='.' && !de->d_name[2]))) continue; - if (strlen(de->d_name) >= PATH_MAX2-l) { + if (strlen(de->d_name) >= PATH_MAXIMUS-l) { errno = ENAMETOOLONG; closedir(d); return -1; @@ -157,25 +157,33 @@ static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, /** * Walks file tree. * + * @return 0 on success, -1 on error, or non-zero `fn` result * @see examples/walk.c for example */ -int nftw(const char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags) +int nftw(const char *dirpath, + int fn(const char *fpath, + const struct stat *st, + int typeflag, + struct FTW *ftwbuf), + int fd_limit, + int flags) { int r, cs; size_t l; - char pathbuf[PATH_MAX2+1]; + char pathbuf[PATH_MAXIMUS+1]; if (fd_limit <= 0) return 0; - l = strlen(path); - if (l > PATH_MAX2) { + l = strlen(dirpath); + if (l > PATH_MAXIMUS) { errno = ENAMETOOLONG; return -1; } - memcpy(pathbuf, path, l+1); + memcpy(pathbuf, dirpath, l+1); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); r = do_nftw(pathbuf, fn, fd_limit, flags, NULL); pthread_setcancelstate(cs, 0); + return r; } diff --git a/tool/build/rm.c b/tool/build/rm.c index d374e277f..b938142ac 100644 --- a/tool/build/rm.c +++ b/tool/build/rm.c @@ -17,13 +17,17 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" +#include "libc/calls/struct/stat.h" #include "libc/errno.h" #include "libc/fmt/magnumstrs.internal.h" +#include "libc/intrin/kprintf.h" #include "libc/runtime/runtime.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/ok.h" +#include "libc/sysv/consts/s.h" #include "third_party/getopt/getopt.internal.h" +#include "third_party/musl/ftw.h" #define USAGE \ " FILE...\n\ @@ -34,11 +38,15 @@ SYNOPSIS\n\ \n\ FLAGS\n\ \n\ - -h help\n\ - -f force\n\ + -h help\n\ + -f force\n\ + -f or -R recursive\n\ + -d remove empty dirs\n\ \n" static bool force; +static bool recursive; +static bool doemptydirs; static const char *prog; static wontreturn void PrintUsage(int rc, int fd) { @@ -48,11 +56,18 @@ static wontreturn void PrintUsage(int rc, int fd) { static void GetOpts(int argc, char *argv[]) { int opt; - while ((opt = getopt(argc, argv, "hf")) != -1) { + while ((opt = getopt(argc, argv, "rRdhf")) != -1) { switch (opt) { case 'f': force = true; break; + case 'd': + doemptydirs = true; + break; + case 'r': + case 'R': + recursive = true; + break; case 'h': PrintUsage(0, 1); default: @@ -61,12 +76,56 @@ static void GetOpts(int argc, char *argv[]) { } } -static void Remove(const char *path) { - if (!force && access(path, W_OK) == -1) { - perror(path); +static int OnFile(const char *fpath, const struct stat *st, int typeflag, + struct FTW *ftwbuf) { + int rc; + if (!force && typeflag == FTW_DNR) { + rc = -1; + } else if (!force && !S_ISLNK(st->st_mode) && access(fpath, W_OK)) { + rc = -1; + } else if (typeflag == FTW_DNR) { + if (!(rc = chmod(fpath, 0700))) { + rc = nftw(fpath, OnFile, 128 - ftwbuf->level, FTW_PHYS | FTW_DEPTH); + } + } else if (typeflag == FTW_DP) { + rc = rmdir(fpath); + } else { + rc = unlink(fpath); + } + if (rc == -1) { + if (force && errno == ENOENT) return 0; + perror(fpath); exit(1); } - if (unlink(path) == -1) { + return 0; +} + +static void Remove(const char *path) { + int rc; + struct stat st; + if (path[0] == '/' && !path[1]) { + tinyprint(2, prog, ": add a dot if you want\n", NULL); + exit(1); + } + if (recursive) { + rc = nftw(path, OnFile, 128, FTW_PHYS | FTW_DEPTH); + } else { + if (lstat(path, &st)) { + if (force && errno == ENOENT) return; + perror(path); + exit(1); + } + if (!force && !S_ISLNK(st.st_mode) && access(path, W_OK)) { + perror(path); + exit(1); + } + if (S_ISDIR(st.st_mode) && doemptydirs) { + rc = rmdir(path); + } else { + rc = unlink(path); + } + } + if (rc == -1) { if (force && errno == ENOENT) return; perror(path); exit(1); @@ -75,17 +134,13 @@ static void Remove(const char *path) { int main(int argc, char *argv[]) { int i; - prog = argv[0]; if (!prog) prog = "rm"; - - if (argc < 2) { + GetOpts(argc, argv); + if (optind == argc) { tinyprint(2, prog, ": missing operand\n", NULL); exit(1); } - - GetOpts(argc, argv); - for (i = optind; i < argc; ++i) { Remove(argv[i]); } diff --git a/tool/scripts/cosmoc++ b/tool/scripts/cosmoc++ index 711349a0f..b3d8e49c2 100755 --- a/tool/scripts/cosmoc++ +++ b/tool/scripts/cosmoc++ @@ -71,7 +71,7 @@ ORIGINAL="$0 $*" PLATFORM="-D__COSMOPOLITAN__" PREDEF="-include libc/integral/normalize.inc" CCFLAGS="-fdata-sections -ffunction-sections -fno-pie -mno-tls-direct-seg-refs -mno-red-zone -fportcosmo" -CXXFLAGS="-fno-exceptions -fuse-cxa-atexit -fno-threadsafe-statics" +CXXFLAGS="-fno-rtti -fno-exceptions -fuse-cxa-atexit -fno-threadsafe-statics" CPPFLAGS="-nostdinc -iquote $COSMO -isystem $COSMOS/include -isystem $COSMO/libc/isystem" LDFLAGS="-static -no-pie -nostdlib -fuse-ld=bfd -Wl,-melf_x86_64" APEFLAGS="-L$COSMOS/lib -Wl,--gc-sections -Wl,-T,$COSMO/o/$MODE/ape/public/ape.lds $COSMO/o/$MODE/ape/ape-no-modify-self.o $COSMO/o/$MODE/libc/crt/crt.o"