mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-02 21:34:15 +00:00
varint: fix computation for remaining buffer space
When encoding varints to a buffer, we want to remain sure that the required buffer space does not exceed what is actually available. Our current check does not do the right thing, though, in that it does not honor that our `pos` variable counts the position down instead of up. As such, we will require too much memory for small varints and not enough memory for big varints. Fix the issue by correctly calculating the required size as `(sizeof(varint) - pos)`. Add a test which failed before.
This commit is contained in:
parent
dd0aa811dd
commit
8a5e7aaecf
@ -36,7 +36,7 @@ int git_encode_varint(unsigned char *buf, size_t bufsize, uintmax_t value)
|
||||
while (value >>= 7)
|
||||
varint[--pos] = 128 | (--value & 127);
|
||||
if (buf) {
|
||||
if (bufsize < pos)
|
||||
if (bufsize < (sizeof(varint) - pos))
|
||||
return -1;
|
||||
memcpy(buf, varint + pos, sizeof(varint) - pos);
|
||||
}
|
||||
|
@ -29,6 +29,9 @@ void test_core_encoding__encode(void)
|
||||
cl_assert(git_encode_varint(buf, 100, 65) == 1);
|
||||
cl_assert(buf[0] == 'A');
|
||||
|
||||
cl_assert(git_encode_varint(buf, 1, 1) == 1);
|
||||
cl_assert(!memcmp(buf, "\x01", 1));
|
||||
|
||||
cl_assert(git_encode_varint(buf, 100, 267869656) == 4);
|
||||
cl_assert(!memcmp(buf, "\xfe\xdc\xbaX", 4));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user