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]
This commit is contained in:
Colin Percival 2008-05-23 05:01:29 +00:00
parent ca42a8e225
commit b011a14a0a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=179235

View File

@ -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;