[metal] Get zipos working

This commit is contained in:
tkchia 2022-10-18 23:12:21 +00:00
parent 3b20faf371
commit 29fae6aca6
2 changed files with 8 additions and 4 deletions

View file

@ -41,6 +41,7 @@ void *GetZipCdir(const uint8_t *p, size_t n) {
size_t i, j; size_t i, j;
v8hi pk = {READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), v8hi pk = {READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"),
READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK")}; READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK")};
uint32_t magic;
i = n - 4; i = n - 4;
asm("" : "+x"(pk)); asm("" : "+x"(pk));
do { do {
@ -54,11 +55,14 @@ void *GetZipCdir(const uint8_t *p, size_t n) {
continue; 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 && i + kZipCdir64LocatorSize <= n &&
IsZipCdir64(p, n, ZIP_LOCATE64_OFFSET(p + i))) { IsZipCdir64(p, n, ZIP_LOCATE64_OFFSET(p + i))) {
return p + 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; j = i;
do { do {
if (READ32LE(p + j) == kZipCdir64LocatorMagic && if (READ32LE(p + j) == kZipCdir64LocatorMagic &&
@ -69,6 +73,6 @@ void *GetZipCdir(const uint8_t *p, size_t n) {
} while (j-- && i - j < 128); } while (j-- && i - j < 128);
return p + i; return p + i;
} }
} while (i--); } while (i-- + 0x10000 + 0x1000 >= n);
return 0; return 0;
} }

View file

@ -163,7 +163,7 @@ static int __zipos_load(struct Zipos *zipos, size_t cf, unsigned flags,
minfd = 3; minfd = 3;
__fds_lock(); __fds_lock();
TryAgain: TryAgain:
if (IsWindows()) { if (IsWindows() || IsMetal()) {
if ((fd = __reservefd_unlocked(-1)) != -1) { if ((fd = __reservefd_unlocked(-1)) != -1) {
return __zipos_setfd(fd, h, flags, mode); return __zipos_setfd(fd, h, flags, mode);
} }