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