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

Reply via email to