Commit 064a60e9 by Patrick Steinhardt

index: verify we have enough space left when writing index entries

In our code writing index entries, we carry around a `disk_size`
representing how much memory we have in total and pass this value to
`git_encode_varint` to do bounds checks. This does not make much sense,
as at the time when passing on this variable it is already out of date.
Fix this by subtracting used memory from `disk_size` as we go along.
Furthermore, assert we've actually got enough space left to do the final
path memcpy.
parent c71dff7e
...@@ -2655,15 +2655,34 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const cha ...@@ -2655,15 +2655,34 @@ static int write_disk_entry(git_filebuf *file, git_index_entry *entry, const cha
ondisk_ext->flags_extended = htons(entry->flags_extended & ondisk_ext->flags_extended = htons(entry->flags_extended &
GIT_IDXENTRY_EXTENDED_FLAGS); GIT_IDXENTRY_EXTENDED_FLAGS);
path = ondisk_ext->path; path = ondisk_ext->path;
} disk_size -= offsetof(struct entry_long, path);
else } else {
path = ondisk->path; path = ondisk->path;
disk_size -= offsetof(struct entry_short, path);
}
if (last) { if (last) {
path += git_encode_varint((unsigned char *) path, varint_len = git_encode_varint((unsigned char *) path,
disk_size, same_len); disk_size, same_len);
assert(varint_len > 0);
path += varint_len;
disk_size -= varint_len;
/*
* If using path compression, we are not allowed
* to have additional trailing NULs.
*/
assert(disk_size == path_len + 1);
} else {
/*
* If no path compression is used, we do have
* NULs as padding. As such, simply assert that
* we have enough space left to write the path.
*/
assert(disk_size > path_len);
} }
memcpy(path, path_start, path_len);
memcpy(path, path_start, path_len + 1);
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment