Commit 8a5e7aae by Patrick Steinhardt

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.
parent dd0aa811
...@@ -36,7 +36,7 @@ int git_encode_varint(unsigned char *buf, size_t bufsize, uintmax_t value) ...@@ -36,7 +36,7 @@ int git_encode_varint(unsigned char *buf, size_t bufsize, uintmax_t value)
while (value >>= 7) while (value >>= 7)
varint[--pos] = 128 | (--value & 127); varint[--pos] = 128 | (--value & 127);
if (buf) { if (buf) {
if (bufsize < pos) if (bufsize < (sizeof(varint) - pos))
return -1; return -1;
memcpy(buf, varint + pos, sizeof(varint) - pos); memcpy(buf, varint + pos, sizeof(varint) - pos);
} }
......
...@@ -29,6 +29,9 @@ void test_core_encoding__encode(void) ...@@ -29,6 +29,9 @@ void test_core_encoding__encode(void)
cl_assert(git_encode_varint(buf, 100, 65) == 1); cl_assert(git_encode_varint(buf, 100, 65) == 1);
cl_assert(buf[0] == 'A'); 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(git_encode_varint(buf, 100, 267869656) == 4);
cl_assert(!memcmp(buf, "\xfe\xdc\xbaX", 4)); cl_assert(!memcmp(buf, "\xfe\xdc\xbaX", 4));
......
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