diff options
author | Pawel Jakub Dawidek <pjd@FreeBSD.org> | 2019-12-22 01:10:38 +0100 |
---|---|---|
committer | Martin Matuska <martin@matuska.org> | 2019-12-29 00:05:13 +0100 |
commit | 1dae5a549fe4ab99fd3a49a9edcf897a7b2b1844 (patch) | |
tree | 6dc76246beae6c3567b20b069bab1af75f408c4b | |
parent | 4f085eea879e2be745f4d9bf57e8513ae48157f4 (diff) | |
download | libarchive-1dae5a549fe4ab99fd3a49a9edcf897a7b2b1844.tar.gz |
Fix possible off-by-one when dealing with readlink(2)
readlink(2) and readlinkat(2) don't append a null byte to the given buffer.
-rw-r--r-- | libarchive/archive_read_disk_entry_from_file.c | 6 | ||||
-rw-r--r-- | test_utils/test_main.c | 2 |
2 files changed, 4 insertions, 4 deletions
diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index 45417e9a..2a8cec8d 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -249,11 +249,11 @@ archive_read_disk_entry_from_file(struct archive *_a, #if defined(HAVE_READLINK) || defined(HAVE_READLINKAT) if (S_ISLNK(st->st_mode)) { - size_t linkbuffer_len = st->st_size + 1; + size_t linkbuffer_len = st->st_size; char *linkbuffer; int lnklen; - linkbuffer = malloc(linkbuffer_len); + linkbuffer = malloc(linkbuffer_len + 1); if (linkbuffer == NULL) { archive_set_error(&a->archive, ENOMEM, "Couldn't read link data"); @@ -280,7 +280,7 @@ archive_read_disk_entry_from_file(struct archive *_a, free(linkbuffer); return (ARCHIVE_FAILED); } - linkbuffer[lnklen] = 0; + linkbuffer[lnklen] = '\0'; archive_entry_set_symlink(entry, linkbuffer); free(linkbuffer); } diff --git a/test_utils/test_main.c b/test_utils/test_main.c index 1b9af9a9..1b44edf1 100644 --- a/test_utils/test_main.c +++ b/test_utils/test_main.c @@ -1863,7 +1863,7 @@ is_symlink(const char *file, int line, return (0); if (contents == NULL) return (1); - linklen = readlink(pathname, buff, sizeof(buff)); + linklen = readlink(pathname, buff, sizeof(buff) - 1); if (linklen < 0) { failure_start(file, line, "Can't read symlink %s", pathname); failure_finish(NULL); |