Fix some errors in archive_read_data that caused failures in bsdtar's
pass-through filtering. Thanks to: Bjoern Koenigönig PR: bin/82878
This commit is contained in:
parent
a423446c40
commit
9b98b2d5d1
@ -347,7 +347,6 @@ archive_read_header_position(struct archive *a)
|
|||||||
ssize_t
|
ssize_t
|
||||||
archive_read_data(struct archive *a, void *buff, size_t s)
|
archive_read_data(struct archive *a, void *buff, size_t s)
|
||||||
{
|
{
|
||||||
off_t remaining;
|
|
||||||
char *dest;
|
char *dest;
|
||||||
size_t bytes_read;
|
size_t bytes_read;
|
||||||
size_t len;
|
size_t len;
|
||||||
@ -364,26 +363,26 @@ archive_read_data(struct archive *a, void *buff, size_t s)
|
|||||||
&a->read_data_offset);
|
&a->read_data_offset);
|
||||||
if (r == ARCHIVE_EOF)
|
if (r == ARCHIVE_EOF)
|
||||||
return (bytes_read);
|
return (bytes_read);
|
||||||
if (r != ARCHIVE_OK)
|
/*
|
||||||
|
* Error codes are all negative, so the status
|
||||||
|
* return here cannot be confused with a valid
|
||||||
|
* byte count. (ARCHIVE_OK is zero.)
|
||||||
|
*/
|
||||||
|
if (r < ARCHIVE_OK)
|
||||||
return (r);
|
return (r);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a->read_data_offset < a->read_data_output_offset) {
|
if (a->read_data_offset < a->read_data_output_offset) {
|
||||||
remaining =
|
archive_set_error(a, ARCHIVE_ERRNO_FILE_FORMAT,
|
||||||
a->read_data_output_offset - a->read_data_offset;
|
"Encountered out-of-order sparse blocks");
|
||||||
if (remaining > (off_t)s)
|
return (ARCHIVE_RETRY);
|
||||||
remaining = (off_t)s;
|
|
||||||
len = (size_t)remaining;
|
|
||||||
memset(dest, 0, len);
|
|
||||||
a->read_data_output_offset += len;
|
|
||||||
s -= len;
|
|
||||||
bytes_read += len;
|
|
||||||
} else {
|
} else {
|
||||||
len = a->read_data_remaining;
|
len = a->read_data_remaining;
|
||||||
if (len > s)
|
if (len > s)
|
||||||
len = s;
|
len = s;
|
||||||
memcpy(dest, a->read_data_block, len);
|
memcpy(dest, a->read_data_block, len);
|
||||||
s -= len;
|
s -= len;
|
||||||
|
a->read_data_block += len;
|
||||||
a->read_data_remaining -= len;
|
a->read_data_remaining -= len;
|
||||||
a->read_data_output_offset += len;
|
a->read_data_output_offset += len;
|
||||||
a->read_data_offset += len;
|
a->read_data_offset += len;
|
||||||
@ -391,7 +390,7 @@ archive_read_data(struct archive *a, void *buff, size_t s)
|
|||||||
bytes_read += len;
|
bytes_read += len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (ARCHIVE_OK);
|
return (bytes_read);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user