Changeset: db24015c9d62 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=db24015c9d62
Modified Files:
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/handlers.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/utils/properties.c
        tools/mserver/shutdowntest.c
Branch: Jul2017
Log Message:

Various resource bugs uncovered by Coverity.


diffs (209 lines):

diff --git a/tools/merovingian/daemon/forkmserver.c 
b/tools/merovingian/daemon/forkmserver.c
--- a/tools/merovingian/daemon/forkmserver.c
+++ b/tools/merovingian/daemon/forkmserver.c
@@ -89,8 +89,6 @@ terminateProcess(pid_t pid, char *dbname
                free(dbname);
                return;
        case SABdbStarting:
-               if (lock)
-                       pthread_mutex_unlock(&fork_lock);
                Mfprintf(stderr, "database '%s' appears to be starting up\n",
                                 dbname);
                /* starting up, so we'll go to the shut down phase */
@@ -395,15 +393,14 @@ forkMserver(char *database, sabdb** stat
                /* refresh stats, now we will have a connection registered */
                msab_freeStatus(stats);
                er = msab_getStatus(stats, database);
+               pthread_mutex_unlock(&fork_lock);
                if (er != NULL) {
                        /* since the client mserver lives its own life anyway,
                         * it's not really a problem we exit here */
                        err e = newErr("%s", er);
                        free(er);
-                       pthread_mutex_unlock(&fork_lock);
                        return(e);
                }
-               pthread_mutex_unlock(&fork_lock);
                return(NO_ERR);
        }
 
@@ -422,9 +419,10 @@ forkMserver(char *database, sabdb** stat
 
        er = msab_getDBfarm(&sabdbfarm);
        if (er != NULL) {
-               err e = newErr("%s", er);
-               free(er);
-               return(e);
+               freeConfFile(ckv);
+               free(ckv);
+               pthread_mutex_unlock(&fork_lock);
+               return(er);
        }
 
        mydoproxy = strcmp(getConfVal(_mero_props, "forward"), "proxy") == 0;
@@ -472,6 +470,10 @@ forkMserver(char *database, sabdb** stat
        if (kv->val != NULL && strcmp(kv->val, "no") != 0) {
                if (embeddedpy) {
                        // only one python version can be active at a time
+                       freeConfFile(ckv);
+                       free(ckv);
+                       pthread_mutex_unlock(&fork_lock);
+                       free(sabdbfarm);
                        return newErr("attempting to start mserver with both 
embedded python2 and embedded python3; only one python version can be active at 
a time\n");
                }
                embeddedpy = "embedded_py=3";
@@ -487,6 +489,7 @@ forkMserver(char *database, sabdb** stat
        /* ok, now exec that mserver we want */
        snprintf(dbpath, sizeof(dbpath),
                         "--dbpath=%s/%s", sabdbfarm, database);
+       free(sabdbfarm);
        snprintf(vaultkey, sizeof(vaultkey),
                         "monet_vault_key=%s/.vaultkey", (*stats)->path);
        snprintf(muri, sizeof(muri),
diff --git a/tools/merovingian/daemon/handlers.c 
b/tools/merovingian/daemon/handlers.c
--- a/tools/merovingian/daemon/handlers.c
+++ b/tools/merovingian/daemon/handlers.c
@@ -70,17 +70,11 @@ sigtostr(int sig)
 void
 handler(int sig)
 {
-       char buf[64];
        const char *signame = sigtostr(sig);
 
-       strcpy(buf, "caught ");
-       if (signame) {
-               strcpy(buf + 7, signame);
-       } else {
-               strcpy(buf + 7, "some signal");
-       }
-       strcpy(buf + strlen(buf), ", starting shutdown sequence\n");
-       if (write(1, buf, strlen(buf)) < 0)
+       if (write(1, "caught ", 7) < 0 ||
+               (signame ? write(1, signame, strlen(signame)) : write(1, "some 
signal", 11)) < 0 ||
+               write(1, ", starting shutdown sequence\n", 29) < 0)
                perror("write failed");
        _mero_keep_listening = 0;
 }
@@ -223,7 +217,6 @@ childhandler(void)
                                if (p->dbname)
                                        free(p->dbname);
                                free(p);
-                               pthread_mutex_unlock(&_mero_topdp_lock);
                                break;
                        }
                        q = p;
diff --git a/tools/merovingian/daemon/merovingian.c 
b/tools/merovingian/daemon/merovingian.c
--- a/tools/merovingian/daemon/merovingian.c
+++ b/tools/merovingian/daemon/merovingian.c
@@ -258,12 +258,10 @@ newErr(const char *fmt, ...)
        va_list ap;
        char message[4096];
        char *ret;
-       int len;
 
        va_start(ap, fmt);
 
-       len = vsnprintf(message, 4095, fmt, ap);
-       message[len] = '\0';
+       (void) vsnprintf(message, sizeof(message), fmt, ap);
 
        va_end(ap);
 
@@ -346,11 +344,12 @@ main(int argc, char *argv[])
        if (_mero_mserver != NULL) {
                /* Find where the string monetdbd actually starts */
                char *s = strstr(_mero_mserver, "monetdbd");
-               if (s != NULL && strncmp(s, "monetdbd", 8) == 0) {
+               if (s != NULL) {
                        /* Replace the 8 following characters with the 
characters mserver5.
                         * This should work even if the executables have 
prefixes or
                         * suffixes */
-                       strncpy(s, "mserver5", 8);
+                       for (int i = 0; i < 8; i++)
+                               s[i] = "mserver5"[i];
                        if (stat(_mero_mserver, &sb) == -1)
                                _mero_mserver = NULL;
                }
diff --git a/tools/merovingian/utils/properties.c 
b/tools/merovingian/utils/properties.c
--- a/tools/merovingian/utils/properties.c
+++ b/tools/merovingian/utils/properties.c
@@ -286,7 +286,7 @@ setProp(char *path, char *key, char *val
        /* ok, if we've reached this point we can write this stuff out! */
        /* Let's check if this was a default property of an additional one.
         * Non-default properties will have a NULL kv */
-       if (kv == NULL) {
+       if (kv == NULL && val != NULL) {
                confkeyval *addProperty = (struct _confkeyval *) 
malloc(sizeof(struct _confkeyval));
                addProperty->key = strdup(key);
                addProperty->val = strdup(val);
diff --git a/tools/mserver/shutdowntest.c b/tools/mserver/shutdowntest.c
--- a/tools/mserver/shutdowntest.c
+++ b/tools/mserver/shutdowntest.c
@@ -34,7 +34,7 @@ static char* dbdir = NULL;
 #define LOAD_SQL_FUNCTION_PTR(fcnname)                                         
    \
     fcnname##_ptr = (fcnname##_ptr_tpe) getAddress(NULL, "lib_sql.dll", 
#fcnname, 0); \
     if (fcnname##_ptr == NULL) {                                               
            \
-        retval = GDKstrdup(#fcnname);  \
+        retval = #fcnname;  \
     }
 
 CREATE_SQL_FUNCTION_PTR(int,SQLautocommit);
@@ -101,6 +101,7 @@ static str monetdb_initialize(void) {
        opt *set = NULL;
        volatile int setlen = 0; /* use volatile for setjmp */
        str retval = MAL_SUCCEED;
+       char *err;
        char prmodpath[1024];
        char *modpath = NULL;
        char *binpath = NULL;
@@ -224,7 +225,9 @@ static str monetdb_initialize(void) {
                                                "unable to open vault_key_file 
%s: %s",
                                                GDKgetenv("monet_vault_key"), 
strerror(errno));
                                /* don't show this as a crash */
-                               msab_registerStop();
+                               err = msab_registerStop();
+                               if (err)
+                                       free(err);
                                GDKfatal("%s", secret);
                        }
                        len = fread(secret, 1, sizeof(secret), secretf);
@@ -233,7 +236,9 @@ static str monetdb_initialize(void) {
                        if (len == 0) {
                                snprintf(secret, sizeof(secret), "vault key has 
zero-length!");
                                /* don't show this as a crash */
-                               msab_registerStop();
+                               err = msab_registerStop();
+                               if (err)
+                                       free(err);
                                GDKfatal("%s", secret);
                        } else if (len < 5) {
                                fprintf(stderr, "#warning: your vault key is 
too short "
@@ -243,14 +248,18 @@ static str monetdb_initialize(void) {
                }
                if ((retval = AUTHunlockVault(secretp)) != MAL_SUCCEED) {
                        /* don't show this as a crash */
-                       msab_registerStop();
+                       err = msab_registerStop();
+                       if (err)
+                               free(err);
                        GDKfatal("%s", retval);
                }
        }
        /* make sure the authorisation BATs are loaded */
        if ((retval = AUTHinitTables(NULL)) != MAL_SUCCEED) {
                /* don't show this as a crash */
-               msab_registerStop();
+               err = msab_registerStop();
+               if (err)
+                       free(err);
                GDKfatal("%s", retval);
        }
 
@@ -268,6 +277,7 @@ static str monetdb_initialize(void) {
 
        if (retval != MAL_SUCCEED) {
                printf("Failed to load SQL function: %s\n", retval);
+               retval = GDKstrdup(retval);
                goto cleanup;
        }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to