Changeset: f64ee7fe3160 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f64ee7fe3160 Modified Files: monetdb5/modules/mal/mal_mapi.c Branch: Oct2020 Log Message:
Don't touch data that was given away to new thread. diffs (179 lines): diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c --- a/monetdb5/modules/mal/mal_mapi.c +++ b/monetdb5/modules/mal/mal_mapi.c @@ -675,6 +675,7 @@ start_listen(SOCKET *sockp, int *portp, static str SERVERlisten(int port, const char *usockfile, int maxusers) { + SOCKET socks[3]; SOCKET *psock; #ifdef HAVE_SYS_UN_H struct sockaddr_un userver; @@ -708,13 +709,13 @@ SERVERlisten(int port, const char *usock throw(ILLARG, "mal_mapi.listen", OPERATION_FAILED ": port number should be between 0 and 65535"); } - psock = GDKmalloc(sizeof(SOCKET) * 3); + psock = GDKmalloc(sizeof(socks)); if (psock == NULL) throw(MAL,"mal_mapi.listen", SQLSTATE(HY013) MAL_MALLOC_FAIL); - psock[0] = psock[1] = psock[2] = INVALID_SOCKET; + socks[0] = socks[1] = socks[2] = INVALID_SOCKET; if (listenaddr == NULL || strcmp(listenaddr, "none") != 0) { - char *msg = start_listen(psock, &port, listenaddr, host, sizeof(host), maxusers); + char *msg = start_listen(socks, &port, listenaddr, host, sizeof(host), maxusers); if (msg != MAL_SUCCEED) { GDKfree(psock); return msg; @@ -727,37 +728,37 @@ SERVERlisten(int port, const char *usock * chars long :/ */ size_t ulen = strlen(usockfile); if (ulen >= sizeof(userver.sun_path)) { - if (psock[0] != INVALID_SOCKET) - closesocket(psock[0]); - if (psock[1] != INVALID_SOCKET) - closesocket(psock[1]); + if (socks[0] != INVALID_SOCKET) + closesocket(socks[0]); + if (socks[1] != INVALID_SOCKET) + closesocket(socks[1]); GDKfree(psock); throw(MAL, "mal_mapi.listen", OPERATION_FAILED ": UNIX socket path too long: %s", usockfile); } - psock[2] = socket(AF_UNIX, SOCK_STREAM + socks[2] = socket(AF_UNIX, SOCK_STREAM #ifdef SOCK_CLOEXEC | SOCK_CLOEXEC #endif , 0); - if (psock[2] == INVALID_SOCKET) { + if (socks[2] == INVALID_SOCKET) { #ifdef _MSC_VER const char *err = wsaerror(WSAGetLastError()); #else const char *err = GDKstrerror(errno, (char[128]){0}, 128); #endif - if (psock[0] != INVALID_SOCKET) - closesocket(psock[0]); - if (psock[1] != INVALID_SOCKET) - closesocket(psock[1]); + if (socks[0] != INVALID_SOCKET) + closesocket(socks[0]); + if (socks[1] != INVALID_SOCKET) + closesocket(socks[1]); GDKfree(psock); throw(IO, "mal_mapi.listen", OPERATION_FAILED ": creation of UNIX socket failed: %s", err); } #if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL) - (void) fcntl(psock[2], F_SETFD, FD_CLOEXEC); + (void) fcntl(socks[2], F_SETFD, FD_CLOEXEC); #endif userver.sun_family = AF_UNIX; @@ -766,25 +767,25 @@ SERVERlisten(int port, const char *usock if (remove(usockfile) == -1 && errno != ENOENT) { char *e = createException(IO, "mal_mapi.listen", OPERATION_FAILED ": remove UNIX socket file: %s", GDKstrerror(errno, (char[128]){0}, 128)); - if (psock[0] != INVALID_SOCKET) - closesocket(psock[0]); - if (psock[1] != INVALID_SOCKET) - closesocket(psock[1]); - closesocket(psock[2]); + if (socks[0] != INVALID_SOCKET) + closesocket(socks[0]); + if (socks[1] != INVALID_SOCKET) + closesocket(socks[1]); + closesocket(socks[2]); GDKfree(psock); return e; } - if (bind(psock[2], (struct sockaddr *) &userver, length) == SOCKET_ERROR) { + if (bind(socks[2], (struct sockaddr *) &userver, length) == SOCKET_ERROR) { #ifdef _MSC_VER const char *err = wsaerror(WSAGetLastError()); #else const char *err = GDKstrerror(errno, (char[128]){0}, 128); #endif - if (psock[0] != INVALID_SOCKET) - closesocket(psock[0]); - if (psock[1] != INVALID_SOCKET) - closesocket(psock[1]); - closesocket(psock[2]); + if (socks[0] != INVALID_SOCKET) + closesocket(socks[0]); + if (socks[1] != INVALID_SOCKET) + closesocket(socks[1]); + closesocket(socks[2]); (void) remove(usockfile); GDKfree(psock); throw(IO, "mal_mapi.listen", @@ -792,17 +793,17 @@ SERVERlisten(int port, const char *usock ": binding to UNIX socket file %s failed: %s", usockfile, err); } - if (listen(psock[2], maxusers) == SOCKET_ERROR) { + if (listen(socks[2], maxusers) == SOCKET_ERROR) { #ifdef _MSC_VER const char *err = wsaerror(WSAGetLastError()); #else const char *err = GDKstrerror(errno, (char[128]){0}, 128); #endif - if (psock[0] != INVALID_SOCKET) - closesocket(psock[0]); - if (psock[1] != INVALID_SOCKET) - closesocket(psock[1]); - closesocket(psock[2]); + if (socks[0] != INVALID_SOCKET) + closesocket(socks[0]); + if (socks[1] != INVALID_SOCKET) + closesocket(socks[1]); + closesocket(socks[2]); (void) remove(usockfile); GDKfree(psock); throw(IO, "mal_mapi.listen", @@ -817,15 +818,16 @@ SERVERlisten(int port, const char *usock * predictable... */ srand((unsigned int) GDKusec()); + memcpy(psock, socks, sizeof(socks)); if (MT_create_thread(&pid, (void (*)(void *)) SERVERlistenThread, psock, MT_THR_DETACHED, "listenThread") != 0) { - if (psock[0] != INVALID_SOCKET) - closesocket(psock[0]); - if (psock[1] != INVALID_SOCKET) - closesocket(psock[1]); + if (socks[0] != INVALID_SOCKET) + closesocket(socks[0]); + if (socks[1] != INVALID_SOCKET) + closesocket(socks[1]); #ifdef HAVE_SYS_UN_H - if (psock[2] != INVALID_SOCKET) - closesocket(psock[2]); + if (socks[2] != INVALID_SOCKET) + closesocket(socks[2]); #endif GDKfree(psock); throw(MAL, "mal_mapi.listen", OPERATION_FAILED ": starting thread failed"); @@ -833,7 +835,7 @@ SERVERlisten(int port, const char *usock TRC_DEBUG(MAL_SERVER, "Ready to accept connections on: %s:%d\n", host, port); - if (psock[0] != INVALID_SOCKET || psock[1] != INVALID_SOCKET) { + if (socks[0] != INVALID_SOCKET || socks[1] != INVALID_SOCKET) { if (!GDKinmemory() && (buf = msab_marchConnection(host, port)) != NULL) free(buf); else @@ -842,7 +844,7 @@ SERVERlisten(int port, const char *usock "mapi:monetdb://%s:%i/\n", host, port); } #ifdef HAVE_SYS_UN_H - if (psock[2] != INVALID_SOCKET) { + if (socks[2] != INVALID_SOCKET) { if (!GDKinmemory() && (buf = msab_marchConnection(usockfile, 0)) != NULL) free(buf); else _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list