Changeset: 234d6a70715b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=234d6a70715b
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_user.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/store.c
Branch: default
Log Message:

Forgot to release lock in case of failure, plus more allocation checks


diffs (239 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -557,10 +557,14 @@ setVariable(Client cntxt, MalBlkPtr mb, 
                                msg = addPipeDefinition(cntxt, buf, newopt);
                                if (msg)
                                        return msg;
-                               if (stack_find_var(m, varname))
-                                       stack_set_string(m, varname, buf);
-                       } else if (stack_find_var(m, varname))
-                               stack_set_string(m, varname, newopt);
+                               if (stack_find_var(m, varname)) {
+                                       if(!stack_set_string(m, varname, buf))
+                                               throw(SQL, "sql.setVariable", 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                               }
+                       } else if (stack_find_var(m, varname)) {
+                               if(!stack_set_string(m, varname, newopt))
+                                       throw(SQL, "sql.setVariable", 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                       }
                }
                return MAL_SUCCEED;
        }
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -285,7 +285,7 @@ SQLinit(void)
        if(stack_push_var(sql, name, &ctype))                                   
\
                stack_set_var(sql, name, VALset(&src, ctype.type->localtype, 
val)); \
        else                                                                    
\
-               failure++;                                                      
    \
+               failure--;                                                      
    \
 
 #define NR_GLOBAL_VARS 10
 /* NR_GLOBAL_VAR should match exactly the number of variables created
@@ -399,6 +399,11 @@ SQLtrans(mvc *m)
                        if (s->schema_name)
                                GDKfree(s->schema_name);
                        s->schema_name = monet5_user_get_def_schema(m, 
m->user_id);
+                       if(!s->schema_name) {
+                               mvc_cancel_session(m);
+                               (void) sql_error(m, 02, SQLSTATE(HY001) 
"Allocation failure while starting the transaction");
+                               return;
+                       }
                        assert(s->schema_name);
                        s->schema = find_sql_schema(s->tr, s->schema_name);
                        assert(s->schema);
@@ -441,6 +446,7 @@ SQLinitClient(Client c)
                bstream *fdin;
 
                if( b == NULL || cbuf == NULL) {
+                       MT_lock_unset(&sql_contextLock);
                        GDKfree(b);
                        GDKfree(cbuf);
                        throw(SQL,"sql.initClient",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
@@ -449,12 +455,14 @@ SQLinitClient(Client c)
                buffer_init(b, cbuf, len);
                buf = buffer_rastream(b, "si");
                if( buf == NULL) {
+                       MT_lock_unset(&sql_contextLock);
                        buffer_destroy(b);
                        throw(SQL,"sql.initClient",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                }
 
                fdin = bstream_create(buf, b->len);
                if( fdin == NULL) {
+                       MT_lock_unset(&sql_contextLock);
                        buffer_destroy(b);
                        throw(SQL,"sql.initClient",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                }
@@ -465,20 +473,30 @@ SQLinitClient(Client c)
        }
        if (c->sqlcontext == 0) {
                m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout);
-               if( m == NULL)
+               if( m == NULL) {
+                       MT_lock_unset(&sql_contextLock);
                        throw(SQL,"sql.initClient",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
-               if(global_variables(m, "monetdb", "sys"))
+               }
+               if(global_variables(m, "monetdb", "sys") < 0) {
+                       MT_lock_unset(&sql_contextLock);
+                       mvc_destroy(m);
                        throw(SQL,"sql.initClient",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               }
                if (isAdministrator(c) || strcmp(c->scenario, "msql") == 0)     
/* console should return everything */
                        m->reply_size = -1;
                be = (void *) backend_create(m, c);
-               if( be == NULL)
+               if( be == NULL) {
+                       MT_lock_unset(&sql_contextLock);
+                       mvc_destroy(m);
                        throw(SQL,"sql.initClient", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               }
        } else {
                be = c->sqlcontext;
                m = be->mvc;
-               if(mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS) < 
0)
+               if(mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS) < 
0) {
+                       MT_lock_unset(&sql_contextLock);
                        throw(SQL,"sql.initClient", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+               }
                backend_reset(be);
        }
        if (m->session->tr)
@@ -488,6 +506,7 @@ SQLinitClient(Client c)
        schema = monet5_user_set_def_schema(m, c->user);
        if (!schema) {
                _DELETE(schema);
+               MT_lock_unset(&sql_contextLock);
                throw(PERMD, "SQLinitClient", SQLSTATE(08004) "schema 
authorization error");
        }
        _DELETE(schema);
@@ -715,6 +734,8 @@ SQLcompile(Client cntxt, MalBlkPtr mb, M
        msg = SQLstatementIntern(cntxt, expr, "SQLcompile", FALSE, FALSE, NULL);
        if (msg == MAL_SUCCEED)
                *ret = _STRDUP("SQLcompile");
+       if(*ret == NULL)
+               throw(SQL,"sql.compile",SQLSTATE(HY001) MAL_MALLOC_FAIL);
        return msg;
 }
 
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -442,7 +442,8 @@ monet5_user_get_def_schema(mvc *m, int u
        rid = table_funcs.column_find_row(m->session->tr, schemas_id, 
&schema_id, NULL);
        if (!is_oid_nil(rid))
                schema = table_funcs.column_find_value(m->session->tr, 
schemas_name, rid);
-       stack_set_string(m, "current_schema", schema);
+       if(!stack_set_string(m, "current_schema", schema))
+               return NULL;
        return schema;
 }
 
@@ -524,9 +525,11 @@ monet5_user_set_def_schema(mvc *m, oid u
                return NULL;
        }
        /* reset the user and schema names */
-       stack_set_string(m, "current_schema", schema);
-       stack_set_string(m, "current_user", username);
-       stack_set_string(m, "current_role", username);
+       if(!stack_set_string(m, "current_schema", schema) ||
+               !stack_set_string(m, "current_user", username) ||
+               !stack_set_string(m, "current_role", username)) {
+               schema = NULL;
+       }
        GDKfree(username);
        mvc_rollback(m, 0, NULL);
        return schema;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -230,6 +230,14 @@ mvc_debug_on(mvc *m, int flg)
        return 0;
 }
 
+void
+mvc_cancel_session(mvc *m)
+{
+       store_lock();
+       sql_trans_end(m->session);
+       store_unlock();
+}
+
 int
 mvc_trans(mvc *m)
 {
@@ -779,7 +787,7 @@ mvc_bind_table(mvc *m, sql_schema *s, co
                if (tpe) {
                        t = tpe;
                } else { /* during exection they are in the declared table 
schema */
-                       s = mvc_bind_schema(m, dt_schema);
+                               s = mvc_bind_schema(m, dt_schema);
                        return mvc_bind_table(m, s, tname);
                }
        } else {
@@ -1653,18 +1661,23 @@ stack_nr_of_declared_tables(mvc *sql)
        return dt;
 }
 
-void
+str
 stack_set_string(mvc *sql, const char *name, const char *val)
 {
        atom *a = stack_get_var(sql, name);
+       str new_val = _STRDUP(val);
 
-       if (a != NULL) {
+       if (a != NULL && new_val != NULL) {
                ValRecord *v = &a->data;
 
                if (v->val.sval)
                        _DELETE(v->val.sval);
-               v->val.sval = _STRDUP(val);
+               v->val.sval = new_val;
+               return new_val;
+       } else if(new_val) {
+               _DELETE(new_val);
        }
+       return NULL;
 }
 
 str
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -142,6 +142,7 @@ extern void mvc_destroy(mvc *c);
 extern int mvc_status(mvc *c);
 extern int mvc_type(mvc *c);
 extern int mvc_debug_on(mvc *m, int flag);
+extern void mvc_cancel_session(mvc *m);
 
 /* since Savepoints and transactions are related the 
  * commit function includes the savepoint creation.
@@ -242,7 +243,7 @@ extern atom * stack_get_var(mvc *sql, co
 extern void stack_set_var(mvc *sql, const char *name, ValRecord *v);
 
 extern str stack_get_string(mvc *sql, const char *name);
-extern void stack_set_string(mvc *sql, const char *name, const char *v);
+extern str stack_set_string(mvc *sql, const char *name, const char *v);
 #ifdef HAVE_HGE
 extern hge val_get_number(ValRecord *val);
 extern hge stack_get_number(mvc *sql, const char *name);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -5473,8 +5473,11 @@ sql_session_reset(sql_session *s, int ac
        sql_schema *tmp;
        char *def_schema_name = _STRDUP("sys");
 
-       if (!s->tr || !def_schema_name)
+       if (!s->tr || !def_schema_name) {
+               if(def_schema_name)
+                       _DELETE(def_schema_name);
                return 0;
+       }
 
        /* TODO cleanup "dt" schema */
        tmp = find_sql_schema(s->tr, "tmp");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to