Cleanup zipos vfork (#1004)

This commit is contained in:
Jōshin 2023-12-13 04:36:44 -05:00 committed by GitHub
parent 6cedbc746c
commit 3b302e6379
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 3 deletions

View file

@ -49,7 +49,7 @@ static int close_impl(int fd) {
}
if (__isfdkind(fd, kFdZip)) {
if (!__vforked && _weaken(__zipos_close)) {
if (_weaken(__zipos_close)) {
return _weaken(__zipos_close)(fd);
}
if (!IsWindows() && !IsMetal()) {

View file

@ -31,14 +31,14 @@
*/
int __zipos_close(int fd) {
int rc;
struct ZiposHandle *h;
h = (struct ZiposHandle *)(intptr_t)g_fds.p[fd].handle;
if (!IsWindows()) {
rc = sys_close(fd);
} else {
rc = 0; // no system file descriptor needed on nt
}
if (!__vforked) {
struct ZiposHandle *h;
h = (struct ZiposHandle *)(intptr_t)g_fds.p[fd].handle;
__zipos_free(h);
}
return rc;

View file

@ -28,6 +28,7 @@
#include "libc/str/str.h"
#include "libc/sysv/consts/o.h"
#include "libc/testlib/hyperion.h"
#include "libc/testlib/subprocess.h"
#include "libc/testlib/testlib.h"
#include "libc/thread/thread.h"
@ -111,3 +112,15 @@ TEST(zipos, lseek) {
EXPECT_EQ(0, memcmp(b1, b2, 512));
EXPECT_SYS(0, 0, close(3));
}
TEST(zipos, closeAfterVfork) {
ASSERT_SYS(0, 3, open("/zip/libc/testlib/hyperion.txt", O_RDONLY));
SPAWN(vfork);
ASSERT_SYS(0, 0, close(3));
ASSERT_SYS(0, 3, open("/etc/hosts", O_RDONLY));
ASSERT_SYS(0, 0, close(3));
ASSERT_SYS(EBADF, -1, close(3));
EXITS(0);
ASSERT_SYS(0, 0, close(3));
ASSERT_SYS(EBADF, -1, close(3));
}