Changeset: 97d4194885f5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/97d4194885f5
Modified Files:
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/handlers.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/multiplex-funnel.c
        tools/merovingian/daemon/proxy.c
        tools/merovingian/utils/control.c
        tools/merovingian/utils/database.c
Branch: Jul2021
Log Message:

Close files.  Mostly in case of (rare) error, but also when reinitializing log 
file.


diffs (186 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
@@ -399,10 +399,13 @@ forkMserver(const char *database, sabdb*
                        freeConfFile(ckv);
                        free(ckv);
                        pthread_mutex_unlock(&dp->fork_lock);
+                       close(pfdo[1]);
+                       close(pfde[1]);
                        return newErr("Failed to open file descriptor\n");
                }
                if(!(f2 = fdopen(pfde[1], "a"))) {
                        fclose(f1);
+                       close(pfde[1]);
                        msab_freeStatus(stats);
                        freeConfFile(ckv);
                        free(ckv);
@@ -443,6 +446,10 @@ forkMserver(const char *database, sabdb*
                freeConfFile(ckv);
                free(ckv);
                pthread_mutex_unlock(&dp->fork_lock);
+               close(pfdo[0]);
+               close(pfdo[1]);
+               close(pfde[0]);
+               close(pfde[1]);
                return(newErr("cannot start database '%s': no .vaultkey found "
                                          "(did you create the database with 
`monetdb create %s`?)",
                                          database, database));
@@ -454,6 +461,10 @@ forkMserver(const char *database, sabdb*
                freeConfFile(ckv);
                free(ckv);
                pthread_mutex_unlock(&dp->fork_lock);
+               close(pfdo[0]);
+               close(pfdo[1]);
+               close(pfde[0]);
+               close(pfde[1]);
                return(er);
        }
 
@@ -696,15 +707,15 @@ forkMserver(const char *database, sabdb*
                int dup_err;
                close(pfdo[0]);
                dup_err = dup2(pfdo[1], 1);
+               if(dup_err == -1)
+                       perror("dup2");
                close(pfdo[1]);
 
                close(pfde[0]);
+               dup_err = dup2(pfde[1], 2);
                if(dup_err == -1)
                        perror("dup2");
-               dup_err = dup2(pfde[1], 2);
                close(pfde[1]);
-               if(dup_err == -1)
-                       perror("dup2");
 
                write_error = write(1, "arguments:", 10);
                for (c = 0; argv[c] != NULL; c++) {
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
@@ -251,10 +251,20 @@ void reinitialize(void)
                                mytime, (long long int)_mero_topdp->next->pid);
                fflush(_mero_logfile);
                _mero_topdp->out = _mero_topdp->err = t;
-               _mero_logfile = fdopen(t, "a");
-               Mfprintf(_mero_logfile, "%s BEG merovingian[%lld]: "
-                               "reopening logfile\n",
-                               mytime, (long long int)_mero_topdp->next->pid);
+               FILE *f = _mero_logfile;
+               if ((_mero_logfile = fdopen(t, "a")) == NULL) {
+                       /* revert to old log so that we have something */
+                       Mfprintf(f, "%s ERR merovingian[%lld]: "
+                                        "failed to reopen logfile",
+                                        mytime, (long long 
int)_mero_topdp->next->pid);
+                       _mero_topdp->out = _mero_topdp->err = fileno(f);
+                       _mero_logfile = f;
+               } else {
+                       fclose(f);
+                       Mfprintf(_mero_logfile, "%s BEG merovingian[%lld]: "
+                                        "reopening logfile\n",
+                                        mytime, (long long 
int)_mero_topdp->next->pid);
+               }
        }
 
        /* logger go ahead! */
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
@@ -519,6 +519,8 @@ main(int argc, char *argv[])
                                /* oops, forking went wrong! */
                                Mfprintf(stderr, "unable to fork into 
background: %s\n",
                                                strerror(errno));
+                               close(pfd[0]);
+                               close(pfd[1]);
                                return(1);
                        case 0:
                                /* detach client from controlling tty, we only 
write to the
@@ -551,6 +553,7 @@ main(int argc, char *argv[])
                                freeConfFile(ckv); /* make debug tools happy */
                                if (read(pfd[0], &buf, 1) != 1) {
                                        Mfprintf(stderr, "unable to retrieve 
startup status\n");
+                                       close(pfd[0]);
                                        return(1);
                                }
                                close(pfd[0]);
diff --git a/tools/merovingian/daemon/multiplex-funnel.c 
b/tools/merovingian/daemon/multiplex-funnel.c
--- a/tools/merovingian/daemon/multiplex-funnel.c
+++ b/tools/merovingian/daemon/multiplex-funnel.c
@@ -317,6 +317,8 @@ multiplexInit(const char *name, const ch
                                free(m->dbcv[i]->user);
                                free(m->dbcv[i]);
                        }
+                       fclose(m->sout);
+                       fclose(m->serr);
                        free(m->dbcv);
                        free(m->pool);
                        free(m);
@@ -331,6 +333,8 @@ multiplexInit(const char *name, const ch
                                free(m->dbcv[i]->user);
                                free(m->dbcv[i]);
                        }
+                       fclose(m->sout);
+                       fclose(m->serr);
                        free(m->dbcv);
                        free(m->pool);
                        free(m);
@@ -353,6 +357,8 @@ multiplexInit(const char *name, const ch
                        free(m->dbcv[i]->user);
                        free(m->dbcv[i]);
                }
+               fclose(m->sout);
+               fclose(m->serr);
                free(m->dbcv);
                free(m->pool);
                free(m);
@@ -367,6 +373,8 @@ multiplexInit(const char *name, const ch
                                free(m->dbcv[i]->user);
                                free(m->dbcv[i]);
                        }
+                       fclose(m->sout);
+                       fclose(m->serr);
                        free(m->dbcv);
                        free(m->pool);
                        free(m);
diff --git a/tools/merovingian/daemon/proxy.c b/tools/merovingian/daemon/proxy.c
--- a/tools/merovingian/daemon/proxy.c
+++ b/tools/merovingian/daemon/proxy.c
@@ -254,7 +254,7 @@ startProxy(int psock, stream *cfdin, str
        }
 
        sfout = block_stream(socket_wstream(ssock, "merovingian->server (proxy 
write)"));
-       if (sfdin == 0 || sfout == 0) {
+       if (sfout == 0) {
                close_stream(sfdin);
                return(newErr("merovingian-server inputstream or outputstream 
problems: %s", mnstr_peek_error(NULL)));
        }
diff --git a/tools/merovingian/utils/control.c 
b/tools/merovingian/utils/control.c
--- a/tools/merovingian/utils/control.c
+++ b/tools/merovingian/utils/control.c
@@ -146,6 +146,7 @@ control_setup(
 
                        control->fdin = 
block_stream(socket_rstream(control->sock, "client in"));
                        if (control->fdin == NULL) {
+                               closesocket(control->sock);
                                snprintf(control->sbuf, sizeof(control->sbuf), 
"cannot connect: %s", mnstr_peek_error(NULL));
                                return strdup(control->sbuf);
                        }
diff --git a/tools/merovingian/utils/database.c 
b/tools/merovingian/utils/database.c
--- a/tools/merovingian/utils/database.c
+++ b/tools/merovingian/utils/database.c
@@ -132,7 +132,13 @@ char* db_create(const char* dbname) {
        /* without an .uplog file, Merovingian won't work, this
         * needs to be last to avoid race conditions */
        snprintf(path, sizeof(path), "%s/%s/.uplog", dbfarm, dbname);
-       fclose(fopen(path, "w"));
+       if ((f = fopen(path, "w")) == NULL) {
+               snprintf(buf, sizeof(buf), "cannot create uplog file: %s",
+                               strerror(errno));
+               free(dbfarm);
+               return(strdup(buf));
+       }
+       fclose(f);
 
        free(dbfarm);
        return(NULL);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to