summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgraham.gower <graham.gower@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>2009-12-02 22:04:07 (EST)
committer graham.gower <graham.gower@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>2009-12-02 22:04:07 (EST)
commitb65cb493330307f8028e7e8ae88f312cb47842b3 (patch)
tree6ba5244c80922bf87e926a7325a3d758a63cc5c7
parentb5e40ef6ba305d7a465062dd49939b96529436c3 (diff)
Fix truncation problem when reading in long lines. Found by Koen Kooi.
After realloc()ing a second time for long lines, buflen was one byte short. It did not take into account buf being pointed at the NULL terminator, before the end of the buffer. So when fgets() was next called, it inserted its NULL terminator one byte earlier than expected. The earlier terminator was not overwritten by subsequent iterations as it should have been. git-svn-id: http://opkg.googlecode.com/svn/trunk@438 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
-rw-r--r--libopkg/pkg_parse.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libopkg/pkg_parse.c b/libopkg/pkg_parse.c
index d01dff5..e0de41f 100644
--- a/libopkg/pkg_parse.c
+++ b/libopkg/pkg_parse.c
@@ -351,16 +351,17 @@ pkg_parse_from_stream_nomalloc(pkg_t *pkg, FILE *fp, uint mask,
}
/*
- * Realloc and move buf past the data already read.
+ * Realloc and point buf past the data already read,
+ * at the NULL terminator inserted by fgets.
* |<--------------- buf0len ----------------->|
* | |<------- buflen ---->|
* |---------------------|---------------------|
* buf0 buf
*/
- buflen = buf0len;
+ buflen = buf0len +1;
buf0len *= 2;
*buf0 = xrealloc(*buf0, buf0len);
- buf = *buf0 + buflen -1;
+ buf = *buf0 + buflen -2;
continue;
}