summaryrefslogtreecommitdiff
path: root/upload-pack.c
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2013-02-20 19:54:57 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-02-20 21:42:21 (GMT)
commite58e57e49eb990e38df19628a744c71b44397ef1 (patch)
tree0bd61d02b2f4c97487002f97e9d90b24c3038e23 /upload-pack.c
parentb7b021701cea6c9e54c826e1f6bc5faa9d3fef53 (diff)
downloadgit-e58e57e49eb990e38df19628a744c71b44397ef1.zip
git-e58e57e49eb990e38df19628a744c71b44397ef1.tar.gz
git-e58e57e49eb990e38df19628a744c71b44397ef1.tar.bz2
upload-pack: do not add duplicate objects to shallow list
When the client tells us it has a shallow object via "shallow <sha1>", we make sure we have the object, mark it with a flag, then add it to a dynamic array of shallow objects. This means that a client can get us to allocate arbitrary amounts of memory just by flooding us with shallow lines (whether they have the objects or not). You can demonstrate it easily with: yes '0035shallow e83c5163316f89bfbde7d9ab23ca2e25604af290' | git-upload-pack git.git We already protect against duplicates in want lines by checking if our flag is already set; let's do the same thing here. Note that a client can still get us to allocate some amount of memory by marking every object in the repo as "shallow" (or "want"). But this at least bounds it with the number of objects in the repository, which is not under the control of an upload-pack client. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'upload-pack.c')
-rw-r--r--upload-pack.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/upload-pack.c b/upload-pack.c
index b058e8d..bd6f255 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -603,8 +603,10 @@ static void receive_needs(void)
die("did not find object for %s", line);
if (object->type != OBJ_COMMIT)
die("invalid shallow object %s", sha1_to_hex(sha1));
- object->flags |= CLIENT_SHALLOW;
- add_object_array(object, NULL, &shallows);
+ if (!(object->flags & CLIENT_SHALLOW)) {
+ object->flags |= CLIENT_SHALLOW;
+ add_object_array(object, NULL, &shallows);
+ }
continue;
}
if (!prefixcmp(line, "deepen ")) {