| @@ -1384,26 +1384,28 @@ __archive_read_filter_ahead(struct archi | | | @@ -1384,26 +1384,28 @@ __archive_read_filter_ahead(struct archi |
1384 | */ | | 1384 | */ |
1385 | int64_t | | 1385 | int64_t |
1386 | __archive_read_consume(struct archive_read *a, int64_t request) | | 1386 | __archive_read_consume(struct archive_read *a, int64_t request) |
1387 | { | | 1387 | { |
1388 | return (__archive_read_filter_consume(a->filter, request)); | | 1388 | return (__archive_read_filter_consume(a->filter, request)); |
1389 | } | | 1389 | } |
1390 | | | 1390 | |
1391 | int64_t | | 1391 | int64_t |
1392 | __archive_read_filter_consume(struct archive_read_filter * filter, | | 1392 | __archive_read_filter_consume(struct archive_read_filter * filter, |
1393 | int64_t request) | | 1393 | int64_t request) |
1394 | { | | 1394 | { |
1395 | int64_t skipped; | | 1395 | int64_t skipped; |
1396 | | | 1396 | |
| | | 1397 | if (request < 0) |
| | | 1398 | return ARCHIVE_FATAL; |
1397 | if (request == 0) | | 1399 | if (request == 0) |
1398 | return 0; | | 1400 | return 0; |
1399 | | | 1401 | |
1400 | skipped = advance_file_pointer(filter, request); | | 1402 | skipped = advance_file_pointer(filter, request); |
1401 | if (skipped == request) | | 1403 | if (skipped == request) |
1402 | return (skipped); | | 1404 | return (skipped); |
1403 | /* We hit EOF before we satisfied the skip request. */ | | 1405 | /* We hit EOF before we satisfied the skip request. */ |
1404 | if (skipped < 0) /* Map error code to 0 for error message below. */ | | 1406 | if (skipped < 0) /* Map error code to 0 for error message below. */ |
1405 | skipped = 0; | | 1407 | skipped = 0; |
1406 | archive_set_error(&filter->archive->archive, | | 1408 | archive_set_error(&filter->archive->archive, |
1407 | ARCHIVE_ERRNO_MISC, | | 1409 | ARCHIVE_ERRNO_MISC, |
1408 | "Truncated input file (needed %jd bytes, only %jd available)", | | 1410 | "Truncated input file (needed %jd bytes, only %jd available)", |
1409 | (intmax_t)request, (intmax_t)skipped); | | 1411 | (intmax_t)request, (intmax_t)skipped); |