mirror of
https://github.com/janet-lang/janet
synced 2024-09-28 07:08:14 +00:00
Address #815 - gc mark issue in windows accept state machine.
We were casting a pointer to the wrong type, which caused all sorts of wonderful chaos, but only on windows and only when the garbage collector ran after setting up a server in a specific configuration. We were casting a closure pointer to an abstract type during the mark phase, which resulted in memory corruption.
This commit is contained in:
parent
2aa1ccdd76
commit
3067f4be3a
@ -132,22 +132,20 @@ JanetAsyncStatus net_machine_accept(JanetListenerState *s, JanetAsyncEvent event
|
|||||||
case JANET_ASYNC_EVENT_MARK: {
|
case JANET_ASYNC_EVENT_MARK: {
|
||||||
if (state->lstream) janet_mark(janet_wrap_abstract(state->lstream));
|
if (state->lstream) janet_mark(janet_wrap_abstract(state->lstream));
|
||||||
if (state->astream) janet_mark(janet_wrap_abstract(state->astream));
|
if (state->astream) janet_mark(janet_wrap_abstract(state->astream));
|
||||||
if (state->function) janet_mark(janet_wrap_abstract(state->function));
|
if (state->function) janet_mark(janet_wrap_function(state->function));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case JANET_ASYNC_EVENT_CLOSE:
|
case JANET_ASYNC_EVENT_CLOSE:
|
||||||
janet_schedule(s->fiber, janet_wrap_nil());
|
janet_schedule(s->fiber, janet_wrap_nil());
|
||||||
return JANET_ASYNC_STATUS_DONE;
|
return JANET_ASYNC_STATUS_DONE;
|
||||||
case JANET_ASYNC_EVENT_COMPLETE: {
|
case JANET_ASYNC_EVENT_COMPLETE: {
|
||||||
int seconds;
|
if (state->astream->flags & JANET_STREAM_CLOSED) {
|
||||||
int bytes = sizeof(seconds);
|
|
||||||
if (NO_ERROR != getsockopt((SOCKET) state->astream->handle, SOL_SOCKET, SO_CONNECT_TIME,
|
|
||||||
(char *)&seconds, &bytes)) {
|
|
||||||
janet_cancel(s->fiber, janet_cstringv("failed to accept connection"));
|
janet_cancel(s->fiber, janet_cstringv("failed to accept connection"));
|
||||||
return JANET_ASYNC_STATUS_DONE;
|
return JANET_ASYNC_STATUS_DONE;
|
||||||
}
|
}
|
||||||
|
SOCKET lsock = (SOCKET) state->lstream->handle;
|
||||||
if (NO_ERROR != setsockopt((SOCKET) state->astream->handle, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
|
if (NO_ERROR != setsockopt((SOCKET) state->astream->handle, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
|
||||||
(char *) & (state->lstream->handle), sizeof(SOCKET))) {
|
(char *) &lsock, sizeof(lsock))) {
|
||||||
janet_cancel(s->fiber, janet_cstringv("failed to accept connection"));
|
janet_cancel(s->fiber, janet_cstringv("failed to accept connection"));
|
||||||
return JANET_ASYNC_STATUS_DONE;
|
return JANET_ASYNC_STATUS_DONE;
|
||||||
}
|
}
|
||||||
@ -411,6 +409,7 @@ JANET_CORE_FN(cfun_net_connect,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Create socket */
|
/* Create socket */
|
||||||
JSock sock = JSOCKDEFAULT;
|
JSock sock = JSOCKDEFAULT;
|
||||||
void *addr = NULL;
|
void *addr = NULL;
|
||||||
@ -431,7 +430,7 @@ JANET_CORE_FN(cfun_net_connect,
|
|||||||
struct addrinfo *rp = NULL;
|
struct addrinfo *rp = NULL;
|
||||||
for (rp = ai; rp != NULL; rp = rp->ai_next) {
|
for (rp = ai; rp != NULL; rp = rp->ai_next) {
|
||||||
#ifdef JANET_WINDOWS
|
#ifdef JANET_WINDOWS
|
||||||
sock = WSASocketW(rp->ai_family, rp->ai_socktype | JSOCKFLAGS, rp->ai_protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
|
sock = WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
|
||||||
#else
|
#else
|
||||||
sock = socket(rp->ai_family, rp->ai_socktype | JSOCKFLAGS, rp->ai_protocol);
|
sock = socket(rp->ai_family, rp->ai_socktype | JSOCKFLAGS, rp->ai_protocol);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user