summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2019-12-13 12:13:05 +0100
committerPatrick Steinhardt <ps@pks.im>2019-12-13 12:21:17 +0100
commit868526138e131601c69f0949c58976700501881f (patch)
treef98f8499a8071a350c23c87a731aa5f412f7152c
parent3e6a9045213268089b567d7a6f7ccf30374b32b7 (diff)
downloadlibgit2-868526138e131601c69f0949c58976700501881f.tar.gz
smart_pkt: fix overflow resulting in OOB read/write of one byte
When parsing OK packets, we copy any information after the initial "ok " prefix into the resulting packet. As newlines act as packet boundaries, we also strip the trailing newline if there is any. We do not check whether there is any data left after the initial "ok " prefix though, which leads to a pointer overflow in that case as `len == 0`: if (line[len - 1] == '\n') --len; This out-of-bounds read is a rather useless gadget, as we can only deduce whether at some offset there is a newline character. In case there accidentally is one, we overflow `len` to `SIZE_MAX` and then write a NUL byte into an array indexed by it: pkt->ref[len] = '\0'; Again, this doesn't seem like something that's possible to be exploited in any meaningful way, but it may surely lead to inconsistencies or DoS. Fix the issue by checking whether there is any trailing data after the packet prefix.
-rw-r--r--src/transports/smart_pkt.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/transports/smart_pkt.c b/src/transports/smart_pkt.c
index 9bc273e0c..56b680d28 100644
--- a/src/transports/smart_pkt.c
+++ b/src/transports/smart_pkt.c
@@ -273,7 +273,7 @@ static int ok_pkt(git_pkt **out, const char *line, size_t len)
line += 3;
len -= 3;
- if (line[len - 1] == '\n')
+ if (len && line[len - 1] == '\n')
--len;
GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, len, 1);