Check for binary blobs in checkout This adds a git_buf_text_is_binary check to blobs before applying filters when the blob data is being written to disk.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
diff --git a/src/checkout.c b/src/checkout.c
index da22df6..98b7f6b 100644
--- a/src/checkout.c
+++ b/src/checkout.c
@@ -685,19 +685,23 @@ static int blob_content_to_file(
git_buf unfiltered = GIT_BUF_INIT, filtered = GIT_BUF_INIT;
git_vector filters = GIT_VECTOR_INIT;
- if (opts->disable_filters ||
+ /* Create a fake git_buf from the blob raw data... */
+ filtered.ptr = blob->odb_object->raw.data;
+ filtered.size = blob->odb_object->raw.len;
+ /* ... and make sure it doesn't get unexpectedly freed */
+ dont_free_filtered = true;
+
+ if (!opts->disable_filters &&
+ !git_buf_text_is_binary(&filtered) &&
(nb_filters = git_filters_load(
&filters,
git_object_owner((git_object *)blob),
path,
- GIT_FILTER_TO_WORKTREE)) == 0) {
-
- /* Create a fake git_buf from the blob raw data... */
- filtered.ptr = blob->odb_object->raw.data;
- filtered.size = blob->odb_object->raw.len;
-
- /* ... and make sure it doesn't get unexpectedly freed */
- dont_free_filtered = true;
+ GIT_FILTER_TO_WORKTREE)) > 0)
+ {
+ /* reset 'filtered' so it can be a filter target */
+ git_buf_init(&filtered, 0);
+ dont_free_filtered = false;
}
if (nb_filters < 0)