Changeset: 2a6318fb847c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2a6318fb847c Modified Files: monetdb5/modules/mal/mal_mapi.c Branch: Oct2020 Log Message:
Delay allocation so that we don't need to free so much when things fail. diffs (89 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 @@ -709,15 +709,11 @@ SERVERlisten(int port, const char *usock throw(ILLARG, "mal_mapi.listen", OPERATION_FAILED ": port number should be between 0 and 65535"); } - psock = GDKmalloc(sizeof(socks)); - if (psock == NULL) - throw(MAL,"mal_mapi.listen", SQLSTATE(HY013) MAL_MALLOC_FAIL); socks[0] = socks[1] = socks[2] = INVALID_SOCKET; if (listenaddr == NULL || strcmp(listenaddr, "none") != 0) { char *msg = start_listen(socks, &port, listenaddr, host, sizeof(host), maxusers); if (msg != MAL_SUCCEED) { - GDKfree(psock); return msg; } } @@ -732,7 +728,6 @@ SERVERlisten(int port, const char *usock 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); @@ -753,7 +748,6 @@ SERVERlisten(int port, const char *usock 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); } @@ -772,7 +766,6 @@ SERVERlisten(int port, const char *usock if (socks[1] != INVALID_SOCKET) closesocket(socks[1]); closesocket(socks[2]); - GDKfree(psock); return e; } if (bind(socks[2], (struct sockaddr *) &userver, length) == SOCKET_ERROR) { @@ -787,7 +780,6 @@ SERVERlisten(int port, const char *usock closesocket(socks[1]); closesocket(socks[2]); (void) remove(usockfile); - GDKfree(psock); throw(IO, "mal_mapi.listen", OPERATION_FAILED ": binding to UNIX socket file %s failed: %s", @@ -805,7 +797,6 @@ SERVERlisten(int port, const char *usock closesocket(socks[1]); closesocket(socks[2]); (void) remove(usockfile); - GDKfree(psock); throw(IO, "mal_mapi.listen", OPERATION_FAILED ": setting UNIX socket file %s to listen failed: %s", @@ -818,17 +809,21 @@ SERVERlisten(int port, const char *usock * predictable... */ srand((unsigned int) GDKusec()); + psock = GDKmalloc(sizeof(socks)); + if (psock == NULL) { + for (int i = 0; i < 3; i++) { + if (socks[i] != INVALID_SOCKET) + closesocket(socks[i]); + } + throw(MAL,"mal_mapi.listen", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } memcpy(psock, socks, sizeof(socks)); if (MT_create_thread(&pid, (void (*)(void *)) SERVERlistenThread, psock, MT_THR_DETACHED, "listenThread") != 0) { - if (socks[0] != INVALID_SOCKET) - closesocket(socks[0]); - if (socks[1] != INVALID_SOCKET) - closesocket(socks[1]); -#ifdef HAVE_SYS_UN_H - if (socks[2] != INVALID_SOCKET) - closesocket(socks[2]); -#endif + for (int i = 0; i < 3; i++) { + if (socks[i] != INVALID_SOCKET) + closesocket(socks[i]); + } GDKfree(psock); throw(MAL, "mal_mapi.listen", OPERATION_FAILED ": starting thread failed"); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list