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