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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list