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