summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Reisner <dreisner@archlinux.org>2012-07-19 10:37:56 -0400
committerDan McGee <dan@archlinux.org>2012-08-01 08:53:10 -0500
commitddbd36103df95b3fbd199466f3203242ab9ed8f2 (patch)
tree8ead776c2c04483bc02ebc33e5e858831d7d75b4
parent35ac4e7ef31898b4d8a090c687aad63df1436083 (diff)
util: fix line length calc in _alpm_archive_fgets
74274b5dc347ba70 which added the real_line_size to the buffer struct didn't properly account for what happens when archive_fgets has to loop more than once to find the end of a line. In most cases, this isn't a problem, but could potentially cause a longer line such as PGP signature to be improperly read. This patch fixes the oversight and focuses on only calculating the line length when we hit the end of line marker. The effective length is then calculated via pointer arithmetic as: (start_of_last_read + read_length) - start_of_line Signed-off-by: Dave Reisner <dreisner@archlinux.org>
-rw-r--r--lib/libalpm/util.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index c2b5d443..0196f3bb 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -1011,15 +1011,16 @@ int _alpm_archive_fgets(struct archive *a, struct archive_read_buffer *b)
}
if(eol) {
- size_t len = b->real_line_size = (size_t)(eol - b->block_offset);
+ size_t len = (size_t)(eol - b->block_offset);
memcpy(b->line_offset, b->block_offset, len);
b->line_offset[len] = '\0';
b->block_offset = eol + 1;
+ b->real_line_size = b->line_offset + len - b->line;
/* this is the main return point; from here you can read b->line */
return ARCHIVE_OK;
} else {
/* we've looked through the whole block but no newline, copy it */
- size_t len = b->real_line_size = (size_t)(b->block + b->block_size - b->block_offset);
+ size_t len = (size_t)(b->block + b->block_size - b->block_offset);
memcpy(b->line_offset, b->block_offset, len);
b->line_offset += len;
b->block_offset = b->block + b->block_size;
@@ -1027,6 +1028,7 @@ int _alpm_archive_fgets(struct archive *a, struct archive_read_buffer *b)
* returned on next call */
if(len == 0) {
b->line_offset[0] = '\0';
+ b->real_line_size = b->line_offset - b->line;
return ARCHIVE_OK;
}
}