diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2005-10-26 16:18:56 +0200 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-10-26 11:52:19 -0700 |
commit | b5c367f75c2990650119749a1add5216871ca47a (patch) | |
tree | e0743dd0ce5cf03505b25902697dcee812e77e38 /upload-pack.c | |
parent | 565ebbf79f61873042c22a7126d002c104e056f4 (diff) | |
download | git-b5c367f75c2990650119749a1add5216871ca47a.tar.gz |
Fix cloning (memory corruption)
upload-pack would set create_full_pack=1 if nr_has==0, but would ask later
if nr_needs<MAX_NEEDS. If that proves true, it would ignore create_full_pack,
and arguments would be written into unreserved memory.
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'upload-pack.c')
-rw-r--r-- | upload-pack.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/upload-pack.c b/upload-pack.c index 07c150595e..878254d72f 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -60,7 +60,7 @@ static void create_pack_file(void) close(fd[1]); *p++ = "git-rev-list"; *p++ = "--objects"; - if (MAX_NEEDS <= nr_needs) + if (create_full_pack || MAX_NEEDS <= nr_needs) *p++ = "--all"; else { for (i = 0; i < nr_needs; i++) { @@ -69,12 +69,13 @@ static void create_pack_file(void) buf += 41; } } - for (i = 0; i < nr_has; i++) { - *p++ = buf; - *buf++ = '^'; - memcpy(buf, sha1_to_hex(has_sha1[i]), 41); - buf += 41; - } + if (!create_full_pack) + for (i = 0; i < nr_has; i++) { + *p++ = buf; + *buf++ = '^'; + memcpy(buf, sha1_to_hex(has_sha1[i]), 41); + buf += 41; + } *p++ = NULL; execvp("git-rev-list", argv); die("git-upload-pack: unable to exec git-rev-list"); |