Changeset: 9596dfbb57e0 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9596dfbb57e0 Modified Files: monetdb5/modules/mal/mal_mapi.c Branch: Jun2016 Log Message:
Check that allocations succeed, and do so before forking. Also don't send message to client that doesn't know how to deal with it. diffs (58 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 @@ -114,8 +114,8 @@ doChallenge(void *data) char *buf = (char *) GDKmalloc(BLOCK + 1); char challenge[13]; char *algos; - stream *fdin = block_stream(((struct challengedata *) data)->in); - stream *fdout = block_stream(((struct challengedata *) data)->out); + stream *fdin = ((struct challengedata *) data)->in; + stream *fdout = ((struct challengedata *) data)->out; bstream *bs; int len = 0; @@ -372,16 +372,36 @@ SERVERlistenThread(SOCKET *Sock) } data->in = socket_rastream(msgsock, "Server read"); data->out = socket_wastream(msgsock, "Server write"); + if (data->in == NULL || data->out == NULL) { + mnstr_destroy(data->in); + mnstr_destroy(data->out); + GDKfree(data); + closesocket(msgsock); + showException(GDKstdout, MAL, "initClient", + "cannot allocate stream"); + continue; + } + data->in = block_stream(data->in); + data->out = block_stream(data->out); + if (data->in == NULL || data->out == NULL) { + mnstr_destroy(data->in); + mnstr_destroy(data->out); + GDKfree(data); + closesocket(msgsock); + showException(GDKstdout, MAL, "initClient", + "cannot allocate stream"); + continue; + } if (MT_create_thread(&tid, doChallenge, data, MT_THR_JOINABLE)) { - mnstr_printf(data->out, "!internal server error (cannot fork new " - "client thread), please try again later\n"); - mnstr_flush(data->out); + mnstr_destroy(data->in); + mnstr_destroy(data->out); + GDKfree(data); + closesocket(msgsock); showException(GDKstdout, MAL, "initClient", "cannot fork new client thread"); - GDKfree(data); - closesocket(msgsock); - } else - GDKregister(tid); + continue; + } + GDKregister(tid); } while (!ATOMIC_GET(serverexiting, atomicLock) && !GDKexiting()); (void) ATOMIC_DEC(nlistener, atomicLock); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list