From b011a14a0a9234e028ff56d8223521a9b527d81c Mon Sep 17 00:00:00 2001 From: Colin Percival Date: Fri, 23 May 2008 05:01:29 +0000 Subject: [PATCH] Check that lseek(2) succeeds and puts us where we expect. [1] While we're here, fix a long-standing bug in the handling of write(2) errors: The API changed from "return # of bytes written" to "return status code" almost 4 years ago, so instead of returning (-1) we need to return ARCHIVE_FATAL. Found by: Coverity Prevent [1] --- lib/libarchive/archive_read_data_into_fd.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/libarchive/archive_read_data_into_fd.c b/lib/libarchive/archive_read_data_into_fd.c index cc15a9c76c3c..b2421bbc827d 100644 --- a/lib/libarchive/archive_read_data_into_fd.c +++ b/lib/libarchive/archive_read_data_into_fd.c @@ -64,8 +64,12 @@ archive_read_data_into_fd(struct archive *a, int fd) ARCHIVE_OK) { const char *p = buff; if (offset > output_offset) { - lseek(fd, offset - output_offset, SEEK_CUR); - output_offset = offset; + output_offset = lseek(fd, + offset - output_offset, SEEK_CUR); + if (output_offset != offset) { + archive_set_error(a, errno, "Seek error"); + return (ARCHIVE_FATAL); + } } while (size > 0) { bytes_to_write = size; @@ -74,7 +78,7 @@ archive_read_data_into_fd(struct archive *a, int fd) bytes_written = write(fd, p, bytes_to_write); if (bytes_written < 0) { archive_set_error(a, errno, "Write error"); - return (-1); + return (ARCHIVE_FATAL); } output_offset += bytes_written; total_written += bytes_written;