Changeset: 985ea67a022c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/985ea67a022c
Modified Files:
        monetdb5/mal/mal_instruction.c
        tools/monetdbe/monetdbe.c
Branch: default
Log Message:

Defense at overwriting error messages in the mdbe structure.
The first one should be handled, this means in practice that
the application code should clear the error status before issuing
a new request.

The code can be checked to see if the first message returned
always makes sense


diffs (truncated from 860 to 300 lines):

diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -1150,6 +1150,7 @@ defConstant(MalBlkPtr mb, int type, ValP
                        GDKfree(ft);
                        GDKfree(tt);
                        freeException(msg);
+                       VALclear(cst);  // it could contain allocated space
                        return -1;
                } else {
                        assert(cst->vtype == type);
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -295,7 +295,7 @@ monetdbe_get_results(monetdbe_result** r
        monetdbe_result_internal* res_internal;
 
        if (!(res_internal = GDKzalloc(sizeof(monetdbe_result_internal)))) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_get_results", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_get_results", MAL_MALLOC_FAIL));
                return mdbe->msg;
        }
        // TODO: set type of result outside.
@@ -314,7 +314,7 @@ monetdbe_get_results(monetdbe_result** r
                if (!res_internal->converted_columns) {
                        GDKfree(res_internal);
                        *result = NULL;
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_get_results", MAL_MALLOC_FAIL);
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_get_results", MAL_MALLOC_FAIL));
                        return mdbe->msg;
                }
        }
@@ -347,11 +347,11 @@ monetdbe_query_internal(monetdbe_databas
        b = (backend *) c->sqlcontext;
 
        if (!query) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_internal", "Query missing");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_query_internal", "Query missing"));
                goto cleanup;
        }
        if (!(query_stream = buffer_rastream(&query_buf, "sqlstatement"))) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_internal", "Could not setup query stream");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_query_internal", "Could not setup query stream"));
                goto cleanup;
        }
        input_query_len = strlen(query);
@@ -361,7 +361,7 @@ monetdbe_query_internal(monetdbe_databas
                query_len += prep_len;
        }
        if (!(nq = GDKmalloc(query_len))) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_internal", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_query_internal", MAL_MALLOC_FAIL));
                goto cleanup;
        }
        if (prepare_id)
@@ -375,12 +375,12 @@ monetdbe_query_internal(monetdbe_databas
 
        fdin_changed = true;
        if (!(c->fdin = bstream_create(query_stream, query_len))) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_internal", "Could not setup query stream");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_query_internal", "Could not setup query stream"));
                goto cleanup;
        }
        query_stream = NULL;
        if (bstream_next(c->fdin) < 0) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_query_internal", "Internal error while starting the query");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_query_internal", "Internal error while starting the query"));
                goto cleanup;
        }
 
@@ -484,7 +484,7 @@ monetdbe_workers_internal(monetdbe_datab
        int workers = 0;
        if (opts && opts->nr_threads) {
                if (opts->nr_threads < 0)
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Nr_threads should be positive");
+                       set_error(mdbe,createException(MAL, 
"monetdbe.monetdbe_startup", "Nr_threads should be positive"));
                else
                        workers = GDKnr_threads = opts->nr_threads;
        }
@@ -497,7 +497,7 @@ monetdbe_memory_internal(monetdbe_databa
        int memory = 0;
        if (opts && opts->memorylimit) {
                if (opts->memorylimit < 0)
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Memorylimit should be positive");
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "Memorylimit should be positive"));
                else /* Memory limit is session specific */
                        memory = opts->memorylimit;
        }
@@ -510,7 +510,7 @@ monetdbe_querytimeout_internal(monetdbe_
        int querytimeout = 0;
        if (opts && opts->querytimeout) {
                if (opts->querytimeout < 0)
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Query timeout should be positive (in sec)");
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "Query timeout should be positive (in sec)"));
                else
                        querytimeout = opts->querytimeout;
        }
@@ -523,7 +523,7 @@ monetdbe_sessiontimeout_internal(monetdb
        int sessiontimeout = 0;
        if (opts && opts->sessiontimeout) {
                if (opts->sessiontimeout < 0)
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Session timeout should be positive (in sec)");
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "Session timeout should be positive (in sec)"));
                else
                        sessiontimeout = opts->sessiontimeout;
        }
@@ -538,12 +538,12 @@ monetdbe_open_internal(monetdbe_database
        if (!mdbe)
                return -1;
        if (!monetdbe_embedded_initialized) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_internal", "Embedded MonetDB is not started");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_internal", "Embedded MonetDB is not started"));
                goto cleanup;
        }
        mdbe->c = MCinitClient((oid) 0, 0, 0);
        if (!MCvalid(mdbe->c)) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_internal", "Failed to initialize client");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_internal", "Failed to initialize client"));
                goto cleanup;
        }
        mdbe->c->curmodule = mdbe->c->usermodule = userModule();
@@ -554,7 +554,7 @@ monetdbe_open_internal(monetdbe_database
        if (mdbe->msg)
                goto cleanup;
        if (mdbe->c->usermodule == NULL) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_internal", "Failed to initialize client MAL module");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_internal", "Failed to initialize client MAL module"));
                goto cleanup;
        }
        if ((mdbe->msg = SQLinitClient(mdbe->c)) != MAL_SUCCEED ||
@@ -568,7 +568,7 @@ monetdbe_open_internal(monetdbe_database
        if (!m->ta)
                m->ta = sa_create(m->pa);
        if (!m->pa || !m->sa || !m->ta) {
-               mdbe->msg = createException(SQL, 
"monetdbe.monetdbe_open_internal", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(SQL, 
"monetdbe.monetdbe_open_internal", MAL_MALLOC_FAIL));
                goto cleanup;
        }
 cleanup:
@@ -620,17 +620,17 @@ monetdbe_startup(monetdbe_database_inter
         with_mapi_server = false;
 
        if (monetdbe_embedded_initialized) {
-               mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", 
"MonetDBe is already initialized");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "MonetDBe is already initialized"));
                return;
        }
 
        if ((setlen = mo_builtin_settings(&set)) == 0) {
-               mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", 
MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL));
                goto cleanup;
        }
        if (dbdir && (setlen = mo_add_option(&set, setlen, opt_cmdline, 
"gdk_dbpath", dbdir)) == 0) {
                mo_free_options(set, setlen);
-               mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", 
MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL));
                goto cleanup;
        }
        if (opts && opts->nr_threads == 1)
@@ -640,7 +640,7 @@ monetdbe_startup(monetdbe_database_inter
 
        if (setlen == 0) {
                mo_free_options(set, setlen);
-               mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", 
MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL));
                goto cleanup;
        }
 
@@ -652,7 +652,7 @@ monetdbe_startup(monetdbe_database_inter
                        setlen = mo_add_option(&set, setlen, opt_cmdline, 
"mapi_port", opts->mapi_server->port);
                        if (setlen == psetlen) {
                                mo_free_options(set, setlen);
-                               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL);
+                               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL));
                                goto cleanup;
                        }
                }
@@ -661,7 +661,7 @@ monetdbe_startup(monetdbe_database_inter
                        setlen = mo_add_option(&set, setlen, opt_cmdline, 
"mapi_usock", opts->mapi_server->usock);
                        if (setlen == psetlen) {
                                mo_free_options(set, setlen);
-                               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL);
+                               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL));
                                goto cleanup;
                        }
                }
@@ -672,7 +672,7 @@ monetdbe_startup(monetdbe_database_inter
                /* if file specified, use it */
                if (GDKtracer_set_tracefile(opts->trace_file) != GDK_SUCCEED) {
                        mo_free_options(set, setlen);
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", GDK_EXCEPTION);
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", GDK_EXCEPTION));
                        goto cleanup;
                }
                GDKtracer_set_adapter("BASIC");
@@ -691,26 +691,26 @@ monetdbe_startup(monetdbe_database_inter
        if (!dbdir) { /* in-memory */
                if (BBPaddfarm(NULL, (1U << PERSISTENT) | (1U << TRANSIENT), 
false) != GDK_SUCCEED) {
                        mo_free_options(set, setlen);
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot add in-memory farm");
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot add in-memory farm"));
                        goto cleanup;
                }
        } else {
                if (BBPaddfarm(dbdir, 1U << PERSISTENT, false) != GDK_SUCCEED ||
                        BBPaddfarm(/*dbextra ? dbextra : */dbdir, 1U << 
TRANSIENT, false) != GDK_SUCCEED) {
                        mo_free_options(set, setlen);
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot add farm %s", dbdir);
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot add farm %s", dbdir));
                        goto cleanup;
                }
                if (GDKcreatedir(dbdir) != GDK_SUCCEED) {
                        mo_free_options(set, setlen);
-                       mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot create directory %s", dbdir);
+                       set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "Cannot create directory %s", dbdir));
                        goto cleanup;
                }
        }
        gdk_res = GDKinit(set, setlen, true);
        mo_free_options(set, setlen);
        if (gdk_res != GDK_SUCCEED) {
-               mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", 
"GDKinit() failed");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", "GDKinit() failed"));
                goto cleanup;
        }
 
@@ -720,7 +720,7 @@ monetdbe_startup(monetdbe_database_inter
        monetdbe_embedded_initialized = true;
        monetdbe_embedded_url = dbdir?GDKstrdup(dbdir):NULL;
        if (dbdir && !monetdbe_embedded_url)
-               mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", 
MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_startup", MAL_MALLOC_FAIL));
        GDKfataljumpenable = 0;
 cleanup:
        if (mdbe->msg)
@@ -756,7 +756,7 @@ monetdbe_open_remote(monetdbe_database_i
 
        monetdbe_remote* remote = opts->remote;
        if (!remote) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", "Missing remote proxy settings");
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_remote", "Missing remote proxy settings"));
                return -1;
        }
 
@@ -770,13 +770,13 @@ monetdbe_open_remote(monetdbe_database_i
        c->curprg = newFunction(putName(mod), putName(name), FUNCTIONsymbol);
 
        if (c->curprg == NULL) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL));
                return -2;
        }
 
        char* url;
        if ((url = monetdbe_create_uri(remote->host, remote->port, 
remote->database)) == NULL) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL));
                return -2;
        }
 
@@ -803,7 +803,7 @@ monetdbe_open_remote(monetdbe_database_i
        pushInstruction(mb, q);
 
        if (p == NULL) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL));
                freeSymbol(c->curprg);
                c->curprg= NULL;
                return -2;
@@ -815,7 +815,7 @@ monetdbe_open_remote(monetdbe_database_i
        }
        MalStkPtr stk = prepareMALstack(mb, mb->vsize);
        if (!stk) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL));
                freeSymbol(c->curprg);
                c->curprg= NULL;
                return -2;
@@ -829,7 +829,7 @@ monetdbe_open_remote(monetdbe_database_i
        }
 
        if ((mdbe->mid = GDKstrdup(*getArgReference_str(stk, p, 0))) == NULL) {
-               mdbe->msg = createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL);
+               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL));
                freeStack(stk);
                freeSymbol(c->curprg);
                c->curprg= NULL;
@@ -875,7 +875,7 @@ monetdbe_open(monetdbe_database *dbhdl, 
                assert(!is_remote||url==NULL);
                monetdbe_startup(mdbe, url, opts);
        } else if (!is_remote && !urls_matches(monetdbe_embedded_url, url)) {
-               mdbe->msg = createException(MAL, "monetdbe.monetdbe_open", 
"monetdbe_open currently only one active database is supported");
+               set_error(mdbe, createException(MAL, "monetdbe.monetdbe_open", 
"monetdbe_open currently only one active database is supported"));
        }
        if (!mdbe->msg)
                res = monetdbe_open_internal(mdbe, opts);
@@ -935,12 +935,11 @@ monetdbe_dump_database(monetdbe_database
        monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl;
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to