Skip to content

Commit ce2ecf2

Browse files
peffgitster
authored andcommitted
apply: use skip_prefix instead of raw addition
A submodule diff generally has content like: -Subproject commit [0-9a-f]{40} +Subproject commit [0-9a-f]{40} When we are using "git apply --index" with a submodule, we first apply the textual diff, and then parse that result to figure out the new sha1. If the diff has bogus input like: -Subproject commit 1234567890123456789012345678901234567890 +bogus we will parse the "bogus" portion. Our parser assumes that the buffer starts with "Subproject commit", and blindly skips past it using strlen(). This can cause us to read random memory after the buffer. This problem was unlikely to have come up in practice (since it requires a malformed diff), and even when it did, we likely noticed the problem anyway as the next operation was to call get_sha1_hex on the random memory. However, we can easily fix it by using skip_prefix to notice the parsing error. Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent cf4fff5 commit ce2ecf2

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

builtin/apply.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3847,9 +3847,10 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
38473847
ce->ce_flags = create_ce_flags(0);
38483848
ce->ce_namelen = namelen;
38493849
if (S_ISGITLINK(mode)) {
3850-
const char *s = buf;
3850+
const char *s;
38513851

3852-
if (get_sha1_hex(s + strlen("Subproject commit "), ce->sha1))
3852+
if (!skip_prefix(buf, "Subproject commit ", &s) ||
3853+
get_sha1_hex(s, ce->sha1))
38533854
die(_("corrupt patch for submodule %s"), path);
38543855
} else {
38553856
if (!cached) {

0 commit comments

Comments
 (0)