log-tree: fix patch filename computation in "git format-patch"
authorChristian Couder <chriscool@tuxfamily.org>
Fri, 27 Mar 2009 00:13:01 +0000 (01:13 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 27 Mar 2009 08:10:27 +0000 (01:10 -0700)
When using "git format-patch", "get_patch_filename" in
"log-tree.c" calls "strbuf_splice" that could die with
the following message:

"`pos + len' is too far after the end of the buffer"

if you have:

buf->len < start_len + FORMAT_PATCH_NAME_MAX

but:

buf->len + suffix_len > start_len + FORMAT_PATCH_NAME_MAX

This patch tries to get rid of that bug.

[jc: w/ simplified logic]

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
log-tree.c

index 56a34885924f32559f6829c43a24541cb0fea1ac..5bd29e6994c92268ec576671bb8564b57d1a5c9d 100644 (file)
@@ -187,17 +187,12 @@ void get_patch_filename(struct commit *commit, int nr, const char *suffix,
 
        strbuf_addf(buf, commit ? "%04d-" : "%d", nr);
        if (commit) {
+               int max_len = start_len + FORMAT_PATCH_NAME_MAX - suffix_len;
+
                format_commit_message(commit, "%f", buf, DATE_NORMAL);
-               /*
-                * Replace characters at the end with the suffix if the
-                * filename is too long
-                */
-               if (buf->len + suffix_len > FORMAT_PATCH_NAME_MAX + start_len)
-                       strbuf_splice(buf,
-                               start_len + FORMAT_PATCH_NAME_MAX - suffix_len,
-                               suffix_len, suffix, suffix_len);
-               else
-                       strbuf_addstr(buf, suffix);
+               if (max_len < buf->len)
+                       strbuf_setlen(buf, max_len);
+               strbuf_addstr(buf, suffix);
        }
 }