]> git.proxmox.com Git - libgit2.git/commitdiff
diff: don't feed large files to xdiff
authorEdward Thomson <ethomson@microsoft.com>
Tue, 29 Sep 2015 16:18:17 +0000 (12:18 -0400)
committerEdward Thomson <ethomson@edwardthomson.com>
Mon, 5 Oct 2015 20:59:50 +0000 (22:59 +0200)
src/checkout.c
src/diff_patch.c
src/diff_xdiff.c
src/diff_xdiff.h
src/merge.c
src/merge_file.c
src/merge_file.h [deleted file]
tests/merge/files.c

index 2a8bfd55848b95fa17ca46bebe983492e9586250..632556622ef003c61624b3362ccbe8fdd6ca2233 100644 (file)
@@ -18,6 +18,7 @@
 #include "git2/submodule.h"
 #include "git2/sys/index.h"
 #include "git2/sys/filter.h"
+#include "git2/merge.h"
 
 #include "refs.h"
 #include "repository.h"
@@ -27,7 +28,7 @@
 #include "diff.h"
 #include "pathspec.h"
 #include "buf_text.h"
-#include "merge_file.h"
+#include "diff_xdiff.h"
 #include "path.h"
 #include "attr.h"
 #include "pool.h"
index 0628da6f21fad13690b57b268de390e3b6f4a388..50faa3b3f7a1610ac0db6a7345c6f86d64842aa8 100644 (file)
@@ -30,6 +30,10 @@ static void diff_patch_update_binary(git_patch *patch)
                (patch->nfile.file->flags & GIT_DIFF_FLAG_BINARY) != 0)
                patch->delta->flags |= GIT_DIFF_FLAG_BINARY;
 
+       else if (patch->ofile.file->size > GIT_XDIFF_MAX_SIZE ||
+                        patch->nfile.file->size > GIT_XDIFF_MAX_SIZE)
+               patch->delta->flags |= GIT_DIFF_FLAG_BINARY;
+
        else if ((patch->ofile.file->flags & DIFF_FLAGS_NOT_BINARY) != 0 &&
                         (patch->nfile.file->flags & DIFF_FLAGS_NOT_BINARY) != 0)
                patch->delta->flags |= GIT_DIFF_FLAG_NOT_BINARY;
index e5984f1c95ea82535d4ee944f8a9e8039008329d..1057df3aaca6128b4e11334231ac84f209e86df2 100644 (file)
@@ -4,6 +4,7 @@
  * This file is part of libgit2, distributed under the GNU GPL v2 with
  * a Linking Exception. For full terms see the included COPYING file.
  */
+#include "git2/errors.h"
 #include "common.h"
 #include "diff.h"
 #include "diff_driver.h"
@@ -208,6 +209,12 @@ static int git_xdiff(git_diff_output *output, git_patch *patch)
        git_patch__old_data(&info.xd_old_data.ptr, &info.xd_old_data.size, patch);
        git_patch__new_data(&info.xd_new_data.ptr, &info.xd_new_data.size, patch);
 
+       if (info.xd_old_data.size > GIT_XDIFF_MAX_SIZE ||
+               info.xd_new_data.size > GIT_XDIFF_MAX_SIZE) {
+               giterr_set(GITERR_INVALID, "files too large for diff");
+               return -1;
+       }
+
        xdl_diff(&info.xd_old_data, &info.xd_new_data,
                &xo->params, &xo->config, &xo->callback);
 
index c547b00cf05388be89ac30ad9cee92733c14da2c..98e11b2cbf6a9821bb0ad9b27dc5efa051ac46be 100644 (file)
 #include "diff_patch.h"
 #include "xdiff/xdiff.h"
 
+/* xdiff cannot cope with large files.  these files should not be passed to
+ * xdiff.  callers should treat these large files as binary.
+ */
+#define GIT_XDIFF_MAX_SIZE (1024LL * 1024 * 1023)
+
 /* A git_xdiff_output is a git_diff_output with extra fields necessary
  * to use libxdiff.  Calling git_xdiff_init() will set the diff_cb field
  * of the output to use xdiff to generate the diffs.
index 89b8e85054ddafdb7b6a4a5596e59edbf76e6a0c..930457bdb27229fd95333ec958e6db20e6b934ea 100644 (file)
@@ -20,7 +20,6 @@
 #include "diff.h"
 #include "checkout.h"
 #include "tree.h"
-#include "merge_file.h"
 #include "blob.h"
 #include "oid.h"
 #include "index.h"
index b174231cc2b06a47063077616b2cd3a2e1f0e987..6d4738065f194e7ad106d8b026c6bc8fcf5ce365 100644 (file)
@@ -7,10 +7,10 @@
 
 #include "common.h"
 #include "repository.h"
-#include "merge_file.h"
 #include "posix.h"
 #include "fileops.h"
 #include "index.h"
+#include "diff_xdiff.h"
 
 #include "git2/repository.h"
 #include "git2/object.h"
@@ -199,7 +199,7 @@ static bool merge_file__is_binary(const git_merge_file_input *file)
 {
        size_t len = file ? file->size : 0;
 
-       if (len > GIT_MERGE_FILE_XDIFF_MAX)
+       if (len > GIT_XDIFF_MAX_SIZE)
                return true;
        if (len > GIT_MERGE_FILE_BINARY_SIZE)
                len = GIT_MERGE_FILE_BINARY_SIZE;
diff --git a/src/merge_file.h b/src/merge_file.h
deleted file mode 100644 (file)
index 08ecfc0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright (C) the libgit2 contributors. All rights reserved.
- *
- * This file is part of libgit2, distributed under the GNU GPL v2 with
- * a Linking Exception. For full terms see the included COPYING file.
- */
-#ifndef INCLUDE_filediff_h__
-#define INCLUDE_filediff_h__
-
-/* xdiff cannot cope with large files, just treat them as binary */
-#define GIT_MERGE_FILE_XDIFF_MAX (1024UL * 1024 * 1023)
-
-#endif
index b365d5a426b70ee99ec5d31bbd51882d90a45fd6..2d55df2b280a1e4d6f9023db66719c3f28901343 100644 (file)
@@ -3,10 +3,10 @@
 #include "git2/merge.h"
 #include "buffer.h"
 #include "merge.h"
-#include "merge_file.h"
 #include "merge_helpers.h"
 #include "refs.h"
 #include "fileops.h"
+#include "diff_xdiff.h"
 
 #define TEST_REPO_PATH "merge-resolve"
 #define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index"
@@ -296,11 +296,11 @@ void test_merge_files__skips_large_files(void)
        git_merge_file_options opts = GIT_MERGE_FILE_OPTIONS_INIT;
        git_merge_file_result result = {0};
 
-       ours.size = GIT_MERGE_FILE_XDIFF_MAX + 1;
+       ours.size = GIT_XDIFF_MAX_SIZE + 1;
        ours.path = "testfile.txt";
        ours.mode = 0100755;
 
-       theirs.size = GIT_MERGE_FILE_XDIFF_MAX + 1;
+       theirs.size = GIT_XDIFF_MAX_SIZE + 1;
        theirs.path = "testfile.txt";
        theirs.mode = 0100755;