Skip to content

Commit c7b7bd7

Browse files
authored
Merge pull request libarchive#2643 from stoeckmann/tar_pax_sparse
tar: Handle extra bytes after sparse entries
2 parents 8d07430 + 715f7ea commit c7b7bd7

2 files changed

Lines changed: 16 additions & 27 deletions

File tree

libarchive/archive_read_support_format_tar.c

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,10 @@ archive_read_format_tar_read_data(struct archive_read *a,
628628
/* If we're at end of file, return EOF. */
629629
if (tar->sparse_list == NULL ||
630630
tar->entry_bytes_remaining == 0) {
631-
if (__archive_read_consume(a, tar->entry_padding) < 0)
631+
int64_t request = tar->entry_bytes_remaining +
632+
tar->entry_padding;
633+
634+
if (__archive_read_consume(a, request) != request)
632635
return (ARCHIVE_FATAL);
633636
tar->entry_padding = 0;
634637
*buff = NULL;
@@ -666,29 +669,15 @@ archive_read_format_tar_read_data(struct archive_read *a,
666669
static int
667670
archive_read_format_tar_skip(struct archive_read *a)
668671
{
669-
int64_t bytes_skipped;
670672
int64_t request;
671-
struct sparse_block *p;
672673
struct tar* tar;
673674

674675
tar = (struct tar *)(a->format->data);
675676

676-
/* Do not consume the hole of a sparse file. */
677-
request = 0;
678-
for (p = tar->sparse_list; p != NULL; p = p->next) {
679-
if (!p->hole) {
680-
if (p->remaining >= INT64_MAX - request) {
681-
return ARCHIVE_FATAL;
682-
}
683-
request += p->remaining;
684-
}
685-
}
686-
if (request > tar->entry_bytes_remaining)
687-
request = tar->entry_bytes_remaining;
688-
request += tar->entry_padding + tar->entry_bytes_unconsumed;
677+
request = tar->entry_bytes_remaining + tar->entry_padding +
678+
tar->entry_bytes_unconsumed;
689679

690-
bytes_skipped = __archive_read_consume(a, request);
691-
if (bytes_skipped < 0)
680+
if (__archive_read_consume(a, request) != request)
692681
return (ARCHIVE_FATAL);
693682

694683
tar->entry_bytes_remaining = 0;
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
begin 644 test_read_format_gtar_sparse_skip_entry.tar.Z
22
M'YV04,+@05(F#)DR<EZ$`<"PH<.'$"-*G$BQHL6*,#+:L$$#!(",,6[4@.$1
33
MI$B2'S.JS#A#A@P0,63,L`$C!HP9-VB\K"FCAHT8`$#@N4BTJ-&C2"/6F4,G
4-
MC)R48^J424HQZE2J$E=F+*G5(]:O8,.*'3M6!LDY:?24Z6'S!DX:,7#(H$%#
5-
MP0R2;>BD:;,V!@T8-6)NE&'#10T<-#;>R(%CAEV28_3R9?LW\(P8-F[`<#%C
6-
M)@T<->#6>`PBC.2^E07;J#'#Q>J-F5DJ<`GBB),J+N;`<3JGC(LV8=2\D<-V
7-
M]DO;N'7S]MTFC9OA/6#,CE'[=N[=<GJ[<!-F<AB[-:HGQZY=3D$V:-6RA>$V
8-
M9]RY=<G*GT^_OOW[^/.#13Z%?!DC:;!1AD+Z%6B12AMUE%)((W'%($I:U603
9-
M#!W%-%---^6T4PPM8184#`:&"-9233V5D57SH2A?A%RMY)6(,,8HHPP*2/=7
10-
M#C8HT-9;[_VE0'PR!BGDD$06:>212"9YD1EOO*&`DE!&*>645%9IY9589JGE
4+
MC)R48^J424HQZE2J$E=F+*G5(]:O8,.*'3M6!LDY:?24Z:$U(XV?,A3,(-F&
5+
M3IHV:V/0@%$CYD89-ES4P/'6QHT<.&;()3G&+MX>>OG&F!'#,`P7,V;2P%&#
6+
M1HP:BT&$<9QW;U_`-FK,<)%ZH^6;"ER"..*DBHLY<)S.*>.B31@U;^1`COV2
7+
MMFW<NGFW2>,F.-O8,6;7OIU;SFX7;L(\#B.WAO3CU:_+*<@&K5K(,&[@](Q#
8+
M!@T:"LC*GT^_OOW[^/.#-3XE?!DC:;!1AD+Z%6B12AMUE%)((W'%($IMK=11
9+
M3#/5=%-..TTF@UY!P6#@AV`MU=13&5DUGXGRM<752EZ!Z.*+,,8%@P)[Y6"#
10+
M`C:IEU,,[>TE5WPP!BGDD$06:>212"9YD1EOO`&DDE!&*>645%9IY9589JGE
1111
MEEQVZ>678(8IYIADEFGFF6BFJ>::;+;IYIMPQBGGG'36:>>=>.:IYYY\]NGG
12-
MGX`&*NB@A!9JJ)YB](D@1PZ>U&B#*468484RT11###7<8!8(&-)4PX=^DN@4
13-
B5%*E6.J*746JTHN'2LFDDZW&*NNLM-9JZZVXYJKKKKR&!0``
12+
MGX`&*NB@A!9J*)YB](D@1PZ>U&B#*44(PX0RT13#9S>8!8*%--70H9\B.@65
13+
A5">2FF)7D:K4XJ%2,NDDJ[#&*NNLM-9JZZVXYJKKKF$!
1414
`
1515
end

0 commit comments

Comments
 (0)