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 -- [email protected]
To unsubscribe send an email to [email protected]