Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-09-16 23:54:40 +0400
committerRussell Belfer <rb@github.com>2013-09-17 20:31:46 +0400
commiteefc32d54944ead5a5e3041c1b1f6c8c946cc014 (patch)
treee6d22bdf1655a37cbde72d192ca9c0d0bae6fa12 /src/filter.c
parenteab3746b3026950ed62842c1e5641556d7131a5b (diff)
Bug fixes and cleanups
This contains a few bug fixes and some header and API cleanups. The main API change is that filters should now use GIT_PASSTHROUGH to indicate that they wish to skip processing a file instead of GIT_ENOTFOUND. The bug fixes include a possible out-of-range buffer access in the ident filter, a filter ordering problem I introduced into the custom filter tests on Windows, and a filter buf NUL termination issue that was coming up on Linux.
Diffstat (limited to 'src/filter.c')
-rw-r--r--src/filter.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/filter.c b/src/filter.c
index 378209800..503f18555 100644
--- a/src/filter.c
+++ b/src/filter.c
@@ -235,7 +235,7 @@ int git_filter_register(
if (!filter_registry_find(NULL, name)) {
giterr_set(
GITERR_FILTER, "Attempt to reregister existing filter '%s'", name);
- return -1;
+ return GIT_EEXISTS;
}
if (filter_def_scan_attrs(&attrs, &nattr, &nmatch, filter->attributes) < 0)
@@ -270,7 +270,7 @@ int git_filter_unregister(const char *name)
git_filter_def *fdef;
/* cannot unregister default filters */
- if (!strcmp(GIT_FILTER_CRLF, name)) {
+ if (!strcmp(GIT_FILTER_CRLF, name) || !strcmp(GIT_FILTER_IDENT, name)) {
giterr_set(GITERR_FILTER, "Cannot unregister filter '%s'", name);
return -1;
}
@@ -476,7 +476,7 @@ int git_filter_list_load(
git__free((void *)values);
- if (error == GIT_ENOTFOUND)
+ if (error == GIT_PASSTHROUGH)
error = 0;
else if (error < 0)
break;
@@ -609,11 +609,13 @@ int git_filter_list_apply_to_data(
error = fe->filter->apply(
fe->filter, &fe->payload, dbuffer[di], dbuffer[si], &fl->source);
- if (error == GIT_ENOTFOUND)
+ if (error == GIT_PASSTHROUGH) {
+ /* PASSTHROUGH means filter decided not to process the buffer */
error = 0;
- else if (!error)
+ } else if (!error) {
+ git_buf_shorten(dbuffer[di], 0); /* force NUL termination */
si = di; /* swap buffers */
- else {
+ } else {
tgt->size = 0;
return error;
}