* [PATCH] Release config lock if the regex is invalid @ 2006-05-07 21:36 Pavel Roskin 2006-05-07 23:37 ` Junio C Hamano 2006-05-08 0:32 ` Johannes Schindelin 0 siblings, 2 replies; 5+ messages in thread From: Pavel Roskin @ 2006-05-07 21:36 UTC (permalink / raw) To: git Signed-off-by: Pavel Roskin <proski@gnu.org> --- config.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/config.c b/config.c index 41066e4..61eacef 100644 --- a/config.c +++ b/config.c @@ -516,6 +516,8 @@ int git_config_set_multivar(const char* fprintf(stderr, "Invalid pattern: %s\n", value_regex); free(store.value_regex); + close(fd); + unlink(lock_file); ret = 6; goto out_free; } ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] Release config lock if the regex is invalid 2006-05-07 21:36 [PATCH] Release config lock if the regex is invalid Pavel Roskin @ 2006-05-07 23:37 ` Junio C Hamano 2006-05-08 0:32 ` Johannes Schindelin 1 sibling, 0 replies; 5+ messages in thread From: Junio C Hamano @ 2006-05-07 23:37 UTC (permalink / raw) To: Pavel Roskin; +Cc: git Thanks. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Release config lock if the regex is invalid 2006-05-07 21:36 [PATCH] Release config lock if the regex is invalid Pavel Roskin 2006-05-07 23:37 ` Junio C Hamano @ 2006-05-08 0:32 ` Johannes Schindelin 2006-05-08 2:38 ` Junio C Hamano 1 sibling, 1 reply; 5+ messages in thread From: Johannes Schindelin @ 2006-05-08 0:32 UTC (permalink / raw) To: Pavel Roskin; +Cc: git Hi, On Sun, 7 May 2006, Pavel Roskin wrote: > @@ -516,6 +516,8 @@ int git_config_set_multivar(const char* > fprintf(stderr, "Invalid pattern: %s\n", > value_regex); > free(store.value_regex); > + close(fd); > + unlink(lock_file); > ret = 6; > goto out_free; > } > This is not enough. There are quite a few exit paths. Notice the "goto out_free"? That is where this must go. This patch is totally untested but obviously correct: diff --git a/config.c b/config.c index 30effe3..d8fd94d 100644 --- a/config.c +++ b/config.c @@ -445,7 +445,7 @@ int git_config_set_multivar(const char* const char* value_regex, int multi_replace) { int i; - int fd; + int fd = -1; int ret; char* config_filename = strdup(git_path("config")); char* lock_file = strdup(git_path("config.lock")); @@ -619,10 +619,14 @@ int git_config_set_multivar(const char* ret = 0; out_free: + if (fd > 0) + close(fd); if (config_filename) free(config_filename); - if (lock_file) + if (lock_file) { + unlink(lock_file); free(lock_file); + } return ret; } ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] Release config lock if the regex is invalid 2006-05-08 0:32 ` Johannes Schindelin @ 2006-05-08 2:38 ` Junio C Hamano 2006-05-08 11:28 ` Johannes Schindelin 0 siblings, 1 reply; 5+ messages in thread From: Junio C Hamano @ 2006-05-08 2:38 UTC (permalink / raw) To: Johannes Schindelin; +Cc: git Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > This is not enough. There are quite a few exit paths. Notice the "goto > out_free"? That is where this must go. > > This patch is totally untested but obviously correct: except that many places you already close(fd) and unlink(lock_file). Somehow it vaguely reminds me of recent "kernel in C++" thread in the other mailing list, which I do not want people to start talking about here, but moving all the clean-up code to exit path indeed makes things simpler to read. How about doing something like this? -- >8 -- diff --git a/config.c b/config.c index 11d65f8..adb5ce4 100644 --- a/config.c +++ b/config.c @@ -420,7 +420,7 @@ int git_config_set_multivar(const char* const char* value_regex, int multi_replace) { int i; - int fd, in_fd; + int fd = -1, in_fd; int ret; char* config_filename = strdup(git_path("config")); char* lock_file = strdup(git_path("config.lock")); @@ -478,15 +478,11 @@ int git_config_set_multivar(const char* if ( ENOENT != errno ) { error("opening %s: %s", config_filename, strerror(errno)); - close(fd); - unlink(lock_file); ret = 3; /* same as "invalid config file" */ goto out_free; } /* if nothing to unset, error out */ if (value == NULL) { - close(fd); - unlink(lock_file); ret = 5; goto out_free; } @@ -514,8 +510,6 @@ int git_config_set_multivar(const char* fprintf(stderr, "Invalid pattern: %s\n", value_regex); free(store.value_regex); - close(fd); - unlink(lock_file); ret = 6; goto out_free; } @@ -551,8 +545,6 @@ int git_config_set_multivar(const char* /* if nothing to unset, or too many matches, error out */ if ((store.seen == 0 && value == NULL) || (store.seen > 1 && multi_replace == 0)) { - close(fd); - unlink(lock_file); ret = 5; goto out_free; } @@ -601,8 +593,6 @@ int git_config_set_multivar(const char* unlink(config_filename); } - close(fd); - if (rename(lock_file, config_filename) < 0) { fprintf(stderr, "Could not rename the lock file?\n"); ret = 4; @@ -612,10 +602,14 @@ int git_config_set_multivar(const char* ret = 0; out_free: + if (0 <= fd) + close(fd); if (config_filename) free(config_filename); - if (lock_file) + if (lock_file) { + unlink(lock_file); free(lock_file); + } return ret; } ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] Release config lock if the regex is invalid 2006-05-08 2:38 ` Junio C Hamano @ 2006-05-08 11:28 ` Johannes Schindelin 0 siblings, 0 replies; 5+ messages in thread From: Johannes Schindelin @ 2006-05-08 11:28 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Hi, On Sun, 7 May 2006, Junio C Hamano wrote: > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > > > This is not enough. There are quite a few exit paths. Notice the "goto > > out_free"? That is where this must go. > > > > This patch is totally untested but obviously correct: > > except that many places you already close(fd) and > unlink(lock_file). Yes, my bad. I forgot to look for (and remove) them. Your patch looks fine to me. Ciao, Dscho ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2006-05-08 11:28 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-05-07 21:36 [PATCH] Release config lock if the regex is invalid Pavel Roskin 2006-05-07 23:37 ` Junio C Hamano 2006-05-08 0:32 ` Johannes Schindelin 2006-05-08 2:38 ` Junio C Hamano 2006-05-08 11:28 ` Johannes Schindelin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).