Changeset: ac7f87e1934a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ac7f87e1934a
Modified Files:
        monetdb5/mal/mal_dataflow.c
Branch: default
Log Message:

DFLOWinitialize(), DFLOWscheduler(), runMALdataflow(): protect against 
dereferencing NULL pointers


diffs (106 lines):

diff --git a/monetdb5/mal/mal_dataflow.c b/monetdb5/mal/mal_dataflow.c
--- a/monetdb5/mal/mal_dataflow.c
+++ b/monetdb5/mal/mal_dataflow.c
@@ -369,6 +369,10 @@ DFLOWinitialize(void)
                return MAL_SUCCEED;
        }
        todo = q_create(2048, "todo");
+       if (todo == NULL) {
+               MT_lock_unset(&mal_contextLock, "DFLOWinitialize");
+               throw(MAL, "dataflow", "DFLOWinitialize(): Failed to create 
todo queue");
+       }
        limit = GDKnr_threads ? GDKnr_threads : 1;
        for (i = 0; i < limit && i < THREADS; i++) {
                if (MT_create_thread(&workers[i], DFLOWworker, (void *) 
&workers[i], MT_THR_JOINABLE) < 0) {
@@ -524,10 +528,13 @@ DFLOWscheduler(DataFlow flow)
        int j;
        InstrPtr p;
 #endif
-       int tasks=0, actions = flow->stop - flow->start;
+       int tasks=0, actions;
        str ret = MAL_SUCCEED;
        FlowEvent fe, f = 0;
 
+       if (flow == NULL)
+               throw(MAL, "dataflow", "DFLOWscheduler(): Called with flow == 
NULL");
+       actions = flow->stop - flow->start;
        if (actions == 0)
                throw(MAL, "dataflow", "Empty dataflow block");
        /* initialize the eligible statements */
@@ -538,6 +545,10 @@ DFLOWscheduler(DataFlow flow)
                if (fe[i].blocks == 0) {
 #ifdef USE_MAL_ADMISSION
                        p = getInstrPtr(flow->mb,fe[i].pc);
+                       if (p == NULL) {
+                               MT_lock_unset(&flow->flowlock, "MALworker");
+                               throw(MAL, "dataflow", "DFLOWscheduler(): 
getInstrPtr(flow->mb,fe[i].pc) returned NULL");
+                       }
                        for (j = p->retc; j < p->argc; j++)
                                fe[i].argclaim = getMemoryClaim(fe[0].flow->mb, 
fe[0].flow->stk, fe[i].pc, j, FALSE);
 #endif
@@ -553,6 +564,8 @@ DFLOWscheduler(DataFlow flow)
                f = q_dequeue(flow->done);
                if (exiting)
                        break;
+               if (f == NULL)
+                       throw(MAL, "dataflow", "DFLOWscheduler(): 
q_dequeue(flow->done) returned NULL");
 
                /*
                 * When an instruction is finished we have to reduce the blocked
@@ -599,6 +612,8 @@ runMALdataflow(Client cntxt, MalBlkPtr m
 #endif
 
        /* in debugging mode we should not start multiple threads */
+       if (stk == NULL)
+               throw(MAL, "dataflow", "runMALdataflow(): Called with stk == 
NULL");
        if (stk->cmd)
                return MAL_SUCCEED;
 
@@ -613,6 +628,8 @@ runMALdataflow(Client cntxt, MalBlkPtr m
        assert(todo);
 
        flow = (DataFlow)GDKzalloc(sizeof(DataFlowRec));
+       if (flow == NULL)
+               throw(MAL, "dataflow", "runMALdataflow(): Failed to allocate 
flow");
 
        flow->cntxt = cntxt;
        flow->mb = mb;
@@ -625,12 +642,38 @@ runMALdataflow(Client cntxt, MalBlkPtr m
 
        MT_lock_init(&flow->flowlock, "DFLOWworker");
        flow->done = q_create(stoppc- startpc+1, "flow->done");
+       if (flow->done == NULL) {
+               MT_lock_destroy(&flow->flowlock);
+               GDKfree(flow);
+               throw(MAL, "dataflow", "runMALdataflow(): Failed to create 
flow->done queue");
+       }
 
        flow->status = (FlowEvent)GDKzalloc((stoppc - startpc + 1) * 
sizeof(FlowEventRec));
+       if (flow->status == NULL) {
+               q_destroy(flow->done);
+               MT_lock_destroy(&flow->flowlock);
+               GDKfree(flow);
+               throw(MAL, "dataflow", "runMALdataflow(): Failed to allocate 
flow->status");
+       }
        size = DFLOWgraphSize(mb, startpc, stoppc);
        size += stoppc - startpc;
        flow->nodes = (int*)GDKzalloc(sizeof(int) * size);
+       if (flow->nodes == NULL) {
+               GDKfree(flow->status);
+               q_destroy(flow->done);
+               MT_lock_destroy(&flow->flowlock);
+               GDKfree(flow);
+               throw(MAL, "dataflow", "runMALdataflow(): Failed to allocate 
flow->nodes");
+       }
        flow->edges = (int*)GDKzalloc(sizeof(int) * size);
+       if (flow->edges == NULL) {
+               GDKfree(flow->nodes);
+               GDKfree(flow->status);
+               q_destroy(flow->done);
+               MT_lock_destroy(&flow->flowlock);
+               GDKfree(flow);
+               throw(MAL, "dataflow", "runMALdataflow(): Failed to allocate 
flow->edges");
+       }
        ret = DFLOWinitBlk(flow, mb, size);
 
        if (ret == MAL_SUCCEED)
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to