diff options
author | Nicolas Pitre <nico@cam.org> | 2008-10-29 19:02:45 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-11-02 15:22:34 -0800 |
commit | d8f325563d85abcd9816311b3a84093b2d1cda9f (patch) | |
tree | f564b9bd64fd42b1bc38dfa8b0e80f52c78f60eb /sha1_file.c | |
parent | 0e8189e2708bc1da08c77c7e1d960f420b6890a5 (diff) | |
download | git-d8f325563d85abcd9816311b3a84093b2d1cda9f.tar.gz |
better validation on delta base object offsets
In one case, it was possible to have a bad offset equal to 0 effectively
pointing a delta onto itself and crashing git after too many recursions.
In the other cases, a negative offset could result due to off_t being
signed. Catch those.
Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1_file.c')
-rw-r--r-- | sha1_file.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sha1_file.c b/sha1_file.c index 88d9cf357f..e57949b415 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1355,7 +1355,7 @@ static off_t get_delta_base(struct packed_git *p, base_offset = (base_offset << 7) + (c & 127); } base_offset = delta_obj_offset - base_offset; - if (base_offset >= delta_obj_offset) + if (base_offset <= 0 || base_offset >= delta_obj_offset) return 0; /* out of bound */ *curpos += used; } else if (type == OBJ_REF_DELTA) { |