diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2016-09-19 03:35:53 +0200 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2016-10-14 11:39:49 +0000 |
commit | f41f5866cebbf88b6ae09ec8bd00c308f4d9f315 (patch) | |
tree | f8dd43e0d82e34fed3093245504982693255bdb5 /gtp | |
parent | f7611c3ceea4afffeded41e287a3200a578e8a5b (diff) |
gsn_restart file: wrap umask change tightly around file creation
An fopen("w") error used to omit the umask() call to reinstate the previous
umask. Also an fopen("r") at the top will never create a file and hence does
not need a umask set.
Instead, wrap the umask change and change-back tightly around the single
fopen("w") call.
Change-Id: If7d948e2f2ba47ecebba5614f18235a53b273d14
Diffstat (limited to 'gtp')
-rw-r--r-- | gtp/gtp.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -648,7 +648,6 @@ static void log_restart(struct gsn_t *gsn) int counter = 0; char *filename; - i = umask(022); filename = talloc_asprintf(NULL, "%s/%s", gsn->statedir, RESTART_FILE); OSMO_ASSERT(filename); @@ -658,7 +657,6 @@ static void log_restart(struct gsn_t *gsn) "State information file (%s) not found. Creating new file.\n", filename); } else { - umask(i); rc = fscanf(f, "%d", &counter); if (rc != 1) { LOGP(DLGTP, LOGL_ERROR, @@ -674,14 +672,18 @@ static void log_restart(struct gsn_t *gsn) gsn->restart_counter = (unsigned char)counter; gsn->restart_counter++; - if (!(f = fopen(filename, "w"))) { + /* Keep the umask closely wrapped around our fopen() call in case the + * log outputs cause file creation. */ + i = umask(022); + f = fopen(filename, "w"); + umask(i); + if (!f) { LOGP(DLGTP, LOGL_ERROR, "fopen(path=%s, mode=%s) failed: Error = %s\n", filename, "w", strerror(errno)); goto free_filename; } - umask(i); fprintf(f, "%d\n", gsn->restart_counter); close_file: if (fclose(f)) |