]> git.proxmox.com Git - libgit2.git/commitdiff
varint: fix computation for remaining buffer space
authorPatrick Steinhardt <ps@pks.im>
Mon, 22 May 2017 10:53:44 +0000 (12:53 +0200)
committerPatrick Steinhardt <ps@pks.im>
Tue, 6 Jun 2017 07:33:53 +0000 (09:33 +0200)
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.

src/varint.c
tests/core/encoding.c

index 2f868607c6ed92aff83622a5de910f3945683034..beac8c7098c1a0e43050760bf989960288e22247 100644 (file)
@@ -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);
        }
index 7d91720f4311c9415046989b8d5501022fb2e54c..a677afe2e92817a2c7bebdcb6248d9bc96796bc6 100644 (file)
@@ -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));