diff options
author | Patrick Steinhardt <ps@pks.im> | 2015-04-10 09:36:38 +0200 |
---|---|---|
committer | Carlos MartÃn Nieto <cmn@dwim.me> | 2015-05-18 21:06:04 +0200 |
commit | 7661fa12c0e0c7a94ae660dabc6336f30029e463 (patch) | |
tree | e8c6d93e24b1bed899ee943bf0ea9ef8536f88ff | |
parent | 702ac40897050b686814463c7ee25f48390bd796 (diff) | |
download | libgit2-7661fa12c0e0c7a94ae660dabc6336f30029e463.tar.gz |
Fix checking of return value for regcomp.
The regcomp function returns a non-zero value if compilation of
a regular expression fails. In most places we only check for
negative values, but positive values indicate an error, as well.
Fix this tree-wide, fixing a segmentation fault when calling
git_config_iterator_glob_new with an invalid regexp.
-rw-r--r-- | src/config.c | 6 | ||||
-rw-r--r-- | src/config_file.c | 4 | ||||
-rw-r--r-- | src/diff_driver.c | 2 | ||||
-rw-r--r-- | tests/config/read.c | 12 |
4 files changed, 18 insertions, 6 deletions
diff --git a/src/config.c b/src/config.c index 0f8c24465..4f209ecf6 100644 --- a/src/config.c +++ b/src/config.c @@ -470,7 +470,7 @@ int git_config_iterator_glob_new(git_config_iterator **out, const git_config *cf iter = git__calloc(1, sizeof(all_iter)); GITERR_CHECK_ALLOC(iter); - if ((result = regcomp(&iter->regex, regexp, REG_EXTENDED)) < 0) { + if ((result = regcomp(&iter->regex, regexp, REG_EXTENDED)) != 0) { giterr_set_regex(&iter->regex, result); regfree(&iter->regex); git__free(iter); @@ -505,7 +505,7 @@ int git_config_backend_foreach_match( int error = 0; if (regexp != NULL) { - if ((error = regcomp(®ex, regexp, REG_EXTENDED)) < 0) { + if ((error = regcomp(®ex, regexp, REG_EXTENDED)) != 0) { giterr_set_regex(®ex, error); regfree(®ex); return -1; @@ -916,7 +916,7 @@ int git_config_multivar_iterator_new(git_config_iterator **out, const git_config if (regexp != NULL) { error = regcomp(&iter->regex, regexp, REG_EXTENDED); - if (error < 0) { + if (error != 0) { giterr_set_regex(&iter->regex, error); error = -1; regfree(&iter->regex); diff --git a/src/config_file.c b/src/config_file.c index 268cced09..d19f3c4e9 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -568,7 +568,7 @@ static int config_set_multivar( } result = regcomp(&preg, regexp, REG_EXTENDED); - if (result < 0) { + if (result != 0) { giterr_set_regex(&preg, result); result = -1; goto out; @@ -654,7 +654,7 @@ static int config_delete_multivar(git_config_backend *cfg, const char *name, con refcounted_strmap_free(map); result = regcomp(&preg, regexp, REG_EXTENDED); - if (result < 0) { + if (result != 0) { giterr_set_regex(&preg, result); result = -1; goto out; diff --git a/src/diff_driver.c b/src/diff_driver.c index c3c5f365b..a397c7206 100644 --- a/src/diff_driver.c +++ b/src/diff_driver.c @@ -116,7 +116,7 @@ static int diff_driver_add_patterns( if (error < 0) break; - if ((error = regcomp(&pat->re, buf.ptr, regex_flags)) < 0) { + if ((error = regcomp(&pat->re, buf.ptr, regex_flags)) != 0) { /* if regex fails to compile, warn? fail? */ error = giterr_set_regex(&pat->re, error); regfree(&pat->re); diff --git a/tests/config/read.c b/tests/config/read.c index 25672729f..b61a2be04 100644 --- a/tests/config/read.c +++ b/tests/config/read.c @@ -343,6 +343,18 @@ static void check_glob_iter(git_config *cfg, const char *regexp, int expected) git_config_iterator_free(iter); } +void test_config_read__iterator_invalid_glob(void) +{ + git_config *cfg; + git_config_iterator *iter; + + cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config9"))); + + cl_git_fail(git_config_iterator_glob_new(&iter, cfg, "*")); + + git_config_free(cfg); +} + void test_config_read__iterator_glob(void) { git_config *cfg; |