mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 17:57:25 +00:00
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.
This commit is contained in:
parent
c71dff7e8a
commit
064a60e96f
27
src/index.c
27
src/index.c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user