remove_leading_path: use a strbuf for internal storage

This function strcpy's directly into a PATH_MAX-sized buffer. There's only one caller, which feeds the git_dir into it, so it's not easy to trigger in practice (even if you fed a large $GIT_DIR through the environment or .git file, it would have to actually exist and be accessible on the filesystem to get to this point). We can fix it by moving to a strbuf. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Sep 24, 2015 at 17:07 UTC 4635768809885bb1c063bc9f9eee38e413f85f0d
1 file changed +6 -4
path.c
+6 -4
@@ -632,7 +632,7 @@ const char *relative_path(const char *in, const char *prefix,
632 */
633 const char *remove_leading_path(const char *in, const char *prefix)
634 {
635 - static char buf[PATH_MAX + 1];
635 + static struct strbuf buf = STRBUF_INIT;
636 int i = 0, j = 0;
637
638 if (!prefix || !prefix[0])
@@ -661,11 +661,13 @@ const char *remove_leading_path(const char *in, const char *prefix)
661 return in;
662 while (is_dir_sep(in[j]))
663 j++;
664 +
665 + strbuf_reset(&buf);
666 if (!in[j])
665 - strcpy(buf, ".");
667 + strbuf_addstr(&buf, ".");
668 else
667 - strcpy(buf, in + j);
668 - return buf;
669 + strbuf_addstr(&buf, in + j);
670 + return buf.buf;
671 }
672
673 /*