Changeset: 0d2e5d18335a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0d2e5d18335a Modified Files: NT/monetdb_config.h.in clients/mapiclient/mnc.c clients/mapilib/mapi.c common/stream/stream.c configure.ag monetdb5/mal/mal_parser.c monetdb5/modules/atoms/json.c monetdb5/modules/mal/language.c monetdb5/modules/mal/mal_mapi.c tools/merovingian/daemon/client.c tools/merovingian/daemon/connections.c tools/merovingian/daemon/controlrunner.c tools/merovingian/daemon/forkmserver.c tools/merovingian/daemon/handlers.c tools/merovingian/daemon/merovingian.c tools/merovingian/daemon/multiplex-funnel.c tools/merovingian/daemon/proxy.c tools/merovingian/utils/control.c tools/merovingian/utils/properties.c tools/mserver/shutdowntest.c Branch: default Log Message:
Merge with Mar2018 branch. diffs (truncated from 1056 to 300 lines): diff --git a/NT/monetdb_config.h.in b/NT/monetdb_config.h.in --- a/NT/monetdb_config.h.in +++ b/NT/monetdb_config.h.in @@ -892,10 +892,6 @@ c99_snprintf(char *outBuf, size_t size, #define ssize_t int #endif -/* normally defined in fcntl.h, but not on Windows */ -#define O_CLOEXEC 0 - - typedef int64_t lng; typedef uint64_t ulng; #define SIZEOF_LNG 8 diff --git a/clients/mapiclient/mnc.c b/clients/mapiclient/mnc.c --- a/clients/mapiclient/mnc.c +++ b/clients/mapiclient/mnc.c @@ -55,6 +55,9 @@ #define SOCKLEN int #endif +#if !defined(HAVE_ACCEPT4) || !defined(SOCK_CLOEXEC) +#define accept4(sockfd, addr, addlen, flags) accept(sockfd, addr, addrlen) +#endif static void usage(void) @@ -162,15 +165,19 @@ main(int argc, char **argv) exit(1); } for (rp = res; rp; rp = rp->ai_next) { - s = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + s = socket(rp->ai_family, rp->ai_socktype +#ifdef SOCK_CLOEXEC + | SOCK_CLOEXEC +#endif + , rp->ai_protocol); if (s == INVALID_SOCKET) continue; if (connect(s, rp->ai_addr, (socklen_t) rp->ai_addrlen) != SOCKET_ERROR) break; /* success */ closesocket(s); } -#ifdef HAVE_FCNTL - fcntl(s, F_SETFD, FD_CLOEXEC); +#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL) + (void) fcntl(s, F_SETFD, FD_CLOEXEC); #endif freeaddrinfo(res); if (rp == NULL) { @@ -191,14 +198,18 @@ main(int argc, char **argv) memcpy(&server.sin_addr, hp->h_addr_list[0], hp->h_length); server.sin_family = hp->h_addrtype; server.sin_port = htons((unsigned short) (port & 0xFFFF)); - s = socket(server.sin_family, SOCK_STREAM, IPPROTO_TCP); + s = socket(server.sin_family, SOCK_STREAM +#ifdef SOCK_CLOEXEC + | SOCK_CLOEXEC +#endif + , IPPROTO_TCP); if (s == INVALID_SOCKET) { fprintf(stderr, "opening socket failed: %s\n", strerror(errno)); exit(1); } -#ifdef HAVE_FCNTL - fcntl(s, F_SETFD, FD_CLOEXEC); +#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL) + (void) fcntl(s, F_SETFD, FD_CLOEXEC); #endif if (connect(s, serv, sizeof(server)) == SOCKET_ERROR) { @@ -220,12 +231,16 @@ main(int argc, char **argv) exit(1); } - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { + if ((sock = socket(AF_INET, SOCK_STREAM +#ifdef SOCK_CLOEXEC + | SOCK_CLOEXEC +#endif + , 0)) == INVALID_SOCKET) { fprintf(stderr, "failed to create socket: %s\n", strerror(errno)); exit(1); } -#ifdef HAVE_FCNTL - fcntl(sock, F_SETFD, FD_CLOEXEC); +#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL) + (void) fcntl(sock, F_SETFD, FD_CLOEXEC); #endif setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on); @@ -244,13 +259,13 @@ main(int argc, char **argv) } listen(sock, 1); - if ((s = accept(sock, (SOCKPTR)0, (socklen_t *)0)) == INVALID_SOCKET) { + if ((s = accept4(sock, (SOCKPTR)0, (socklen_t *)0, SOCK_CLOEXEC)) == INVALID_SOCKET) { fprintf(stderr, "failed to accept connection: %s\n", strerror(errno)); exit(1); } -#ifdef HAVE_FCNTL - fcntl(s, F_SETFD, FD_CLOEXEC); +#if defined(HAVE_FCNTL) && (!defined(SOCK_CLOEXEC) || !defined(HAVE_ACCEPT4)) + (void) fcntl(s, F_SETFD, FD_CLOEXEC); #endif } diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -2364,7 +2364,11 @@ mapi_reconnect(Mapi mid) return mapi_setError(mid, "path name too long", "mapi_reconnect", MERROR); } - if ((s = socket(PF_UNIX, SOCK_STREAM, 0)) == INVALID_SOCKET) { + if ((s = socket(PF_UNIX, SOCK_STREAM +#ifdef SOCK_CLOEXEC + | SOCK_CLOEXEC +#endif + , 0)) == INVALID_SOCKET) { snprintf(errbuf, sizeof(errbuf), "opening socket failed: %s", #ifdef _MSC_VER @@ -2375,7 +2379,7 @@ mapi_reconnect(Mapi mid) ); return mapi_setError(mid, errbuf, "mapi_reconnect", MERROR); } -#ifdef HAVE_FCNTL +#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL) (void) fcntl(s, F_SETFD, FD_CLOEXEC); #endif memset(&userver, 0, sizeof(struct sockaddr_un)); @@ -2441,10 +2445,14 @@ mapi_reconnect(Mapi mid) return mapi_setError(mid, errbuf, "mapi_reconnect", MERROR); } for (rp = res; rp; rp = rp->ai_next) { - s = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + s = socket(rp->ai_family, rp->ai_socktype +#ifdef SOCK_CLOEXEC + | SOCK_CLOEXEC +#endif + , rp->ai_protocol); if (s == INVALID_SOCKET) continue; -#ifdef HAVE_FCNTL +#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL) (void) fcntl(s, F_SETFD, FD_CLOEXEC); #endif if (connect(s, rp->ai_addr, (socklen_t) rp->ai_addrlen) != SOCKET_ERROR) @@ -2485,7 +2493,11 @@ mapi_reconnect(Mapi mid) memcpy(&server.sin_addr, hp->h_addr_list[0], hp->h_length); server.sin_family = hp->h_addrtype; server.sin_port = htons((unsigned short) (mid->port & 0xFFFF)); - s = socket(server.sin_family, SOCK_STREAM, IPPROTO_TCP); + s = socket(server.sin_family, SOCK_STREAM +#ifdef SOCK_CLOEXEC + | SOCK_CLOEXEC +#endif + , IPPROTO_TCP); if (s == INVALID_SOCKET) { snprintf(errbuf, sizeof(errbuf), "opening socket failed: %s", @@ -2497,7 +2509,7 @@ mapi_reconnect(Mapi mid) ); return mapi_setError(mid, errbuf, "mapi_reconnect", MERROR); } -#ifdef HAVE_FCNTL +#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL) (void) fcntl(s, F_SETFD, FD_CLOEXEC); #endif diff --git a/configure.ag b/configure.ag --- a/configure.ag +++ b/configure.ag @@ -2606,6 +2606,7 @@ AC_FUNC_FSEEKO save_LIBS="$LIBS" LIBS="$LIBS $MATH_LIBS" AC_CHECK_FUNCS([\ + accept4 \ asctime_r \ backtrace \ cbrt \ @@ -2627,6 +2628,7 @@ AC_CHECK_FUNCS([\ mremap \ nl_langinfo \ _NSGetExecutablePath \ + pipe2 \ popen \ posix_fadvise \ posix_fallocate \ diff --git a/monetdb5/mal/mal_parser.c b/monetdb5/mal/mal_parser.c --- a/monetdb5/mal/mal_parser.c +++ b/monetdb5/mal/mal_parser.c @@ -1115,8 +1115,8 @@ fcnHeader(Client cntxt, int kind) cntxt->backup = cntxt->curprg; cntxt->curprg = newFunction( modnme, fnme, kind); if(cntxt->curprg == NULL) { + cntxt->curprg = cntxt->backup; parseError(cntxt, SQLSTATE(HY001) MAL_MALLOC_FAIL); - cntxt->curprg = cntxt->backup; return 0; } cntxt->curprg->def->errors = cntxt->backup->def->errors; @@ -1559,7 +1559,7 @@ parseAssign(Client cntxt, int cntrl) pushInstruction(curBlk, curInstr); return; } - GETvariable((void) 0); + GETvariable(freeInstruction(curInstr)); if (currChar(cntxt) == ':') { setVarUDFtype(curBlk, varid); type = typeElm(cntxt, getVarType(curBlk, varid)); @@ -1611,7 +1611,7 @@ parseAssign(Client cntxt, int cntrl) } /* Get target variable details*/ - GETvariable((void) 0); + GETvariable(freeInstruction(curInstr)); if (!(currChar(cntxt) == ':' && CURRENT(cntxt)[1] == '=')) { curInstr->argv[0] = varid; if (currChar(cntxt) == ':') { diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c --- a/monetdb5/modules/atoms/json.c +++ b/monetdb5/modules/atoms/json.c @@ -2215,7 +2215,7 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, } } else { len = strlen(v); - if (len >= maxlen) { + if (len + 7 >= maxlen) { maxlen += len + BUFSIZ; buf2 = GDKrealloc(buf, maxlen); if (buf2 == NULL) { @@ -2226,10 +2226,10 @@ JSONjsonaggr(BAT **bnp, BAT *b, BAT *g, } switch (b->ttype) { case TYPE_str: - len = snprintf(buf, maxlen, "[ \"%s\" ]", v); + snprintf(buf, maxlen, "[ \"%s\" ]", v); break; case TYPE_dbl: - len = snprintf(buf, maxlen, "[ %s ]", v); + snprintf(buf, maxlen, "[ %s ]", v); break; } } diff --git a/monetdb5/modules/mal/language.c b/monetdb5/modules/mal/language.c --- a/monetdb5/modules/mal/language.c +++ b/monetdb5/modules/mal/language.c @@ -195,7 +195,7 @@ CMDregisterFunction(Client cntxt, MalBlk fcnName = putName(*fcn); modName = putName(*mod); ahelp = GDKstrdup(*help); - if(fcnName == NULL || modName == NULL || help == NULL) { + if(fcnName == NULL || modName == NULL || ahelp == NULL) { freeSymbol(sym); GDKfree(ahelp); throw(MAL, "language.register", SQLSTATE(HY001) MAL_MALLOC_FAIL); 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 @@ -72,6 +72,10 @@ #define SOCKLEN int #endif +#if !defined(HAVE_ACCEPT4) || !defined(SOCK_CLOEXEC) +#define accept4(sockfd, addr, addrlen, flags) accept(sockfd, addr, addrlen) +#endif + static char seedChars[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', @@ -353,7 +357,7 @@ SERVERlistenThread(SOCKET *Sock) continue; } if (sock != INVALID_SOCKET && FD_ISSET(sock, &fds)) { - if ((msgsock = accept(sock, (SOCKPTR)0, (socklen_t *)0)) == INVALID_SOCKET) { + if ((msgsock = accept4(sock, (SOCKPTR)0, (socklen_t *)0, SOCK_CLOEXEC)) == INVALID_SOCKET) { if ( #ifdef _MSC_VER WSAGetLastError() != WSAEINTR @@ -366,7 +370,7 @@ SERVERlistenThread(SOCKET *Sock) } continue; } -#ifdef HAVE_FCNTL +#if defined(HAVE_FCNTL) && (!defined(SOCK_CLOEXEC) || !defined(HAVE_ACCEPT4)) (void) fcntl(msgsock, F_SETFD, FD_CLOEXEC); #endif #ifdef HAVE_SYS_UN_H @@ -378,7 +382,7 @@ SERVERlistenThread(SOCKET *Sock) char ccmsg[CMSG_SPACE(sizeof(int))]; struct cmsghdr *cmsg; - if ((msgsock = accept(usock, (SOCKPTR)0, (socklen_t *)0)) == INVALID_SOCKET) { + if ((msgsock = accept4(usock, (SOCKPTR)0, (socklen_t *)0, SOCK_CLOEXEC)) == INVALID_SOCKET) { if ( #ifdef _MSC_VER _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list