]> git.ipfire.org Git - thirdparty/git.git/commitdiff
range-diff: use ssize_t for parsed "len" in read_patches()
authorJeff King <peff@peff.net>
Mon, 9 Aug 2021 22:48:48 +0000 (18:48 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 10 Aug 2021 18:37:36 +0000 (11:37 -0700)
As we iterate through the buffer containing git-log output, parsing
lines, we use an "int" to store the size of an individual line. This
should be a size_t, as we have no guarantee that there is not a
malicious 2GB+ commit-message line in the output.

Overflowing this integer probably doesn't do anything _too_ terrible. We
are not using the value to size a buffer, so the worst case is probably
an out-of-bounds read from before the array. But it's easy enough to
fix.

Note that we have to use ssize_t here, since we also store the length
result from parse_git_diff_header(), which may return a negative value
for error. That function actually returns an int itself, which has a
similar overflow problem, but I'll leave that for another day. Much
of the apply.c code uses ints and should be converted as a whole; in the
meantime, a negative return from parse_git_diff_header() will be
interpreted as an error, and we'll bail (so we can't handle such a case,
but given that it's likely to be malicious anyway, the important thing
is we don't have any memory errors).

Signed-off-by: Jeff King <peff@peff.net>
Acked-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
range-diff.c

index 87e82ee859ee4cc7e495da0f281b39dd2e56f9d2..012b4ea6d2cc9812f3f7089f9239d44cef58b88c 100644 (file)
@@ -38,7 +38,7 @@ static int read_patches(const char *range, struct string_list *list,
        struct patch_util *util = NULL;
        int in_header = 1;
        char *line, *current_filename = NULL;
-       int len;
+       ssize_t len;
        size_t size;
 
        strvec_pushl(&cp.args, "log", "--no-color", "-p", "--no-merges",