From: Martin Matuška Date: Sat, 31 May 2025 19:31:14 +0000 (+0200) Subject: Merge pull request #2643 from stoeckmann/tar_pax_sparse X-Git-Tag: v3.8.1~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bc2fcdafcea8a34c41b81d1c77221f69f5171104;p=thirdparty%2Flibarchive.git Merge pull request #2643 from stoeckmann/tar_pax_sparse tar: Handle extra bytes after sparse entries (cherry picked from commit c7b7bd7c0e3aa29caf874efe6686cd0f78e1842d) --- diff --git a/libarchive/archive_read_support_format_tar.c b/libarchive/archive_read_support_format_tar.c index cdb1444fd..0c87bc6d7 100644 --- a/libarchive/archive_read_support_format_tar.c +++ b/libarchive/archive_read_support_format_tar.c @@ -628,7 +628,10 @@ archive_read_format_tar_read_data(struct archive_read *a, /* If we're at end of file, return EOF. */ if (tar->sparse_list == NULL || tar->entry_bytes_remaining == 0) { - if (__archive_read_consume(a, tar->entry_padding) < 0) + int64_t request = tar->entry_bytes_remaining + + tar->entry_padding; + + if (__archive_read_consume(a, request) != request) return (ARCHIVE_FATAL); tar->entry_padding = 0; *buff = NULL; @@ -666,29 +669,15 @@ archive_read_format_tar_read_data(struct archive_read *a, static int archive_read_format_tar_skip(struct archive_read *a) { - int64_t bytes_skipped; int64_t request; - struct sparse_block *p; struct tar* tar; tar = (struct tar *)(a->format->data); - /* Do not consume the hole of a sparse file. */ - request = 0; - for (p = tar->sparse_list; p != NULL; p = p->next) { - if (!p->hole) { - if (p->remaining >= INT64_MAX - request) { - return ARCHIVE_FATAL; - } - request += p->remaining; - } - } - if (request > tar->entry_bytes_remaining) - request = tar->entry_bytes_remaining; - request += tar->entry_padding + tar->entry_bytes_unconsumed; + request = tar->entry_bytes_remaining + tar->entry_padding + + tar->entry_bytes_unconsumed; - bytes_skipped = __archive_read_consume(a, request); - if (bytes_skipped < 0) + if (__archive_read_consume(a, request) != request) return (ARCHIVE_FATAL); tar->entry_bytes_remaining = 0; diff --git a/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu b/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu index 634ac0673..1aff5d386 100644 --- a/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu +++ b/libarchive/test/test_read_format_gtar_sparse_skip_entry.tar.Z.uu @@ -1,15 +1,15 @@ begin 644 test_read_format_gtar_sparse_skip_entry.tar.Z M'YV04,+@05(F#)DRBD:;,V!@T8-6)NE&'#10T<-#;>R(%CAEV28_3R9?LW\(P8-F[`<#%C -M)@T<->#6>`PBC.2^E07;J#'#Q>J-F5DJ<`GBB),J+N;`<3JGC(LV8=2\D<-V -M]DO;N'7S]MTFC9OA/6#,CE'[=N[=$V -M9]RY=212"9YD1EOO*&`DE!&*>645%9IY9589JGE +MC)R48^J424HQZE2J$E=F+*G5(]:O8,.*'3M6!LDY:?24Z:$U(XV?,A3,(-F& +M3IHV:V/0@%$CYD89-ES4P/'6QHT<.&;()3G&+MX>>OG&F!'#,`P7,V;2P%&# +M1HP:BT&$<9QW;U_`-FK,<)%ZH^6;"ER"..*DBHLY<)S.*>.B31@U;^1`COV2 +MMFW,F.-O8,6;7OIU;SFX7;L(\#B.WAO3CU:_+*<@&K5K(,&[@](Q# +M!@T:"LC*GT^_OOW[^/.#-3XE?!DC:;!1AD+Z%6B12AMUE%)((W'%($IMK=11 +M3#/5=%-..TTF@UY!P6#@AV`MU=13&5DUGXGRM<752EZ!Z.*+,,8%@P)[Y6"# +M`C:IEU,,[>TE5WPP!BGDD$06:>212"9YD1EOO`&DDE!&*>645%9IY9589JGE MEEQVZ>678(8IYIADEFGFF6BFJ>::;+;IYIMPQBGGG'36:>>=>.:IYYY\]NGG -MGX`&*NB@A!9JJ)YB](D@1PZ>U&B#*468484RT11###7<8!8(&-)4PX=^DN@4 -B5%*E6.J*746JTHN'2LFDDZW&*NNLM-9JZZVXYJKKKKR&!0`` +MGX`&*NB@A!9J*)YB](D@1PZ>U&B#*44(PX0RT13#9S>8!8*%--70H9\B.@65 +A5">2FF)7D:K4XJ%2,NDDJ[#&*NNLM-9JZZVXYJKKKF$! ` end