From 29fae6aca64d5e1b0e82a88c23dc6b898702ed58 Mon Sep 17 00:00:00 2001 From: tkchia Date: Tue, 18 Oct 2022 23:12:21 +0000 Subject: [PATCH] [metal] Get zipos working --- libc/str/getzipcdir.c | 10 +++++++--- libc/zipos/open.c | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/libc/str/getzipcdir.c b/libc/str/getzipcdir.c index 25ccdf17d..968275045 100644 --- a/libc/str/getzipcdir.c +++ b/libc/str/getzipcdir.c @@ -41,6 +41,7 @@ void *GetZipCdir(const uint8_t *p, size_t n) { size_t i, j; v8hi pk = {READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK")}; + uint32_t magic; i = n - 4; asm("" : "+x"(pk)); do { @@ -54,11 +55,14 @@ void *GetZipCdir(const uint8_t *p, size_t n) { continue; } } - if (READ32LE(p + i) == kZipCdir64LocatorMagic && + while (magic = READ32LE(p + i), + magic != kZipCdir64LocatorMagic && magic != kZipCdirHdrMagic && + i + 0x10000 + 0x1000 >= n) --i; + if (magic == kZipCdir64LocatorMagic && i + kZipCdir64LocatorSize <= n && IsZipCdir64(p, n, ZIP_LOCATE64_OFFSET(p + i))) { return p + ZIP_LOCATE64_OFFSET(p + i); - } else if (READ32LE(p + i) == kZipCdirHdrMagic && IsZipCdir32(p, n, i)) { + } else if (magic == kZipCdirHdrMagic && IsZipCdir32(p, n, i)) { j = i; do { if (READ32LE(p + j) == kZipCdir64LocatorMagic && @@ -69,6 +73,6 @@ void *GetZipCdir(const uint8_t *p, size_t n) { } while (j-- && i - j < 128); return p + i; } - } while (i--); + } while (i-- + 0x10000 + 0x1000 >= n); return 0; } diff --git a/libc/zipos/open.c b/libc/zipos/open.c index 097b4eb3f..0c37fe211 100644 --- a/libc/zipos/open.c +++ b/libc/zipos/open.c @@ -163,7 +163,7 @@ static int __zipos_load(struct Zipos *zipos, size_t cf, unsigned flags, minfd = 3; __fds_lock(); TryAgain: - if (IsWindows()) { + if (IsWindows() || IsMetal()) { if ((fd = __reservefd_unlocked(-1)) != -1) { return __zipos_setfd(fd, h, flags, mode); }