Changeset: 74edd596de96 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=74edd596de96
Modified Files:
monetdb5/modules/mal/mal_mapi.c
Branch: Apr2019
Log Message:
Close socket when not listening.
diffs (111 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
@@ -316,8 +316,7 @@ SERVERlistenThread(SOCKET *Sock)
msgsock = usock;
#endif
retval = select((int)msgsock + 1, &fds, NULL, NULL, &tv);
- if (ATOMIC_GET(&serverexiting) ||
- GDKexiting())
+ if (ATOMIC_GET(&serverexiting) || GDKexiting())
break;
if (retval == 0) {
/* nothing interesting has happened */
@@ -487,12 +486,19 @@ SERVERlistenThread(SOCKET *Sock)
"cannot fork new client
thread");
continue;
}
- } while (!ATOMIC_GET(&serverexiting) &&
- !GDKexiting());
+ } while (!ATOMIC_GET(&serverexiting) && !GDKexiting());
(void) ATOMIC_DEC(&nlistener);
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
+ if (usock != INVALID_SOCKET)
+ closesocket(usock);
return;
error:
fprintf(stderr, "!mal_mapi.listen: %s, terminating listener\n", msg);
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
+ if (usock != INVALID_SOCKET)
+ closesocket(usock);
}
/**
@@ -651,7 +657,7 @@ SERVERlisten(int *Port, str *Usockfile,
server.sin_zero[i] = 0;
length = (SOCKLEN) sizeof(server);
- do {
+ for (;;) {
server.sin_port = htons((unsigned short) ((port) &
0xFFFF));
if (bind(sock, (SOCKPTR) &server, length) ==
SOCKET_ERROR) {
int e = errno;
@@ -685,7 +691,7 @@ SERVERlisten(int *Port, str *Usockfile,
} else {
break;
}
- } while (1);
+ }
if (getsockname(sock, (SOCKPTR) &server, &length) ==
SOCKET_ERROR) {
int e = errno;
@@ -730,6 +736,8 @@ SERVERlisten(int *Port, str *Usockfile,
GDKfree(psock);
GDKfree(usockfile);
errno = e;
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
throw(IO, "mal_mapi.listen",
OPERATION_FAILED ": creation of UNIX socket
failed: %s",
#ifdef _MSC_VER
@@ -747,6 +755,8 @@ SERVERlisten(int *Port, str *Usockfile,
* chars long :/ */
if (strlen(usockfile) >= sizeof(userver.sun_path)) {
char *e;
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
closesocket(usock);
GDKfree(psock);
e = createException(MAL, "mal_mapi.listen",
@@ -763,6 +773,8 @@ SERVERlisten(int *Port, str *Usockfile,
length = (SOCKLEN) sizeof(userver);
if(remove(usockfile) == -1 && errno != ENOENT) {
char *e = createException(IO, "mal_mapi.listen",
OPERATION_FAILED ": remove UNIX socket file");
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
closesocket(usock);
GDKfree(usockfile);
GDKfree(psock);
@@ -771,6 +783,8 @@ SERVERlisten(int *Port, str *Usockfile,
if (bind(usock, (SOCKPTR) &userver, length) == SOCKET_ERROR) {
char *e;
int err = errno;
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
closesocket(usock);
(void) remove(usockfile);
GDKfree(psock);
@@ -791,6 +805,8 @@ SERVERlisten(int *Port, str *Usockfile,
if(listen(usock, maxusers) == SOCKET_ERROR) {
char *e;
int err = errno;
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
closesocket(usock);
(void) remove(usockfile);
GDKfree(psock);
@@ -824,6 +840,12 @@ SERVERlisten(int *Port, str *Usockfile,
psock[2] = INVALID_SOCKET;
if (MT_create_thread(&pid, (void (*)(void *)) SERVERlistenThread, psock,
MT_THR_JOINABLE,
"listenThread") != 0) {
+ if (sock != INVALID_SOCKET)
+ closesocket(sock);
+#ifdef HAVE_SYS_UN_H
+ if (usock != INVALID_SOCKET)
+ closesocket(usock);
+#endif
GDKfree(psock);
if (usockfile)
GDKfree(usockfile);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list