Commit ad10db2af8d911d0b0913207ba919116375f09b4

Russell Belfer 2013-01-10T15:59:36

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.

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)