mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 13:52:28 +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 (__isfdkind(fd, kFdZip)) {
|
||||||
if (!__vforked && _weaken(__zipos_close)) {
|
if (_weaken(__zipos_close)) {
|
||||||
return _weaken(__zipos_close)(fd);
|
return _weaken(__zipos_close)(fd);
|
||||||
}
|
}
|
||||||
if (!IsWindows() && !IsMetal()) {
|
if (!IsWindows() && !IsMetal()) {
|
||||||
|
|
|
@ -31,14 +31,14 @@
|
||||||
*/
|
*/
|
||||||
int __zipos_close(int fd) {
|
int __zipos_close(int fd) {
|
||||||
int rc;
|
int rc;
|
||||||
struct ZiposHandle *h;
|
|
||||||
h = (struct ZiposHandle *)(intptr_t)g_fds.p[fd].handle;
|
|
||||||
if (!IsWindows()) {
|
if (!IsWindows()) {
|
||||||
rc = sys_close(fd);
|
rc = sys_close(fd);
|
||||||
} else {
|
} else {
|
||||||
rc = 0; // no system file descriptor needed on nt
|
rc = 0; // no system file descriptor needed on nt
|
||||||
}
|
}
|
||||||
if (!__vforked) {
|
if (!__vforked) {
|
||||||
|
struct ZiposHandle *h;
|
||||||
|
h = (struct ZiposHandle *)(intptr_t)g_fds.p[fd].handle;
|
||||||
__zipos_free(h);
|
__zipos_free(h);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "libc/str/str.h"
|
#include "libc/str/str.h"
|
||||||
#include "libc/sysv/consts/o.h"
|
#include "libc/sysv/consts/o.h"
|
||||||
#include "libc/testlib/hyperion.h"
|
#include "libc/testlib/hyperion.h"
|
||||||
|
#include "libc/testlib/subprocess.h"
|
||||||
#include "libc/testlib/testlib.h"
|
#include "libc/testlib/testlib.h"
|
||||||
#include "libc/thread/thread.h"
|
#include "libc/thread/thread.h"
|
||||||
|
|
||||||
|
@ -111,3 +112,15 @@ TEST(zipos, lseek) {
|
||||||
EXPECT_EQ(0, memcmp(b1, b2, 512));
|
EXPECT_EQ(0, memcmp(b1, b2, 512));
|
||||||
EXPECT_SYS(0, 0, close(3));
|
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…
Add table
Add a link
Reference in a new issue