mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
Cleanup zipos vfork (#1004)
This commit is contained in:
parent
6cedbc746c
commit
3b302e6379
3 changed files with 16 additions and 3 deletions
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue