From: Mostyn Bramley-Moore Date: Sun, 15 Dec 2024 22:12:02 +0000 (+0100) Subject: 7zip reader: add LZMA + RISCV BCJ filter (#2403) X-Git-Tag: v3.8.0~106 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ee9b638fba0ed1f3e53f6260c4500cbcfa9fcfba;p=thirdparty%2Flibarchive.git 7zip reader: add LZMA + RISCV BCJ filter (#2403) 7-Zip 24.05 and liblzma 5.5.1alpha added a RISC-V BCJ filter. Let's enable this combination if we can. Note that this does not allow the use of the RISC-V filter with other compressors. --- diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ad62f5b4..10009d5dd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,6 +23,8 @@ jobs: run: ./build/ci/build.sh -a configure env: BS: ${{ matrix.bs }} + # Avoid using liblzma from the Xcode 16 / MacOSX15.0.sdk, which fails RISCV filter tests. + CMAKE_ARGS: -D LIBLZMA_LIBRARY=/opt/homebrew/lib/liblzma.dylib -D LIBLZMA_INCLUDE_DIR=/opt/homebrew/include/lzma.h - name: Build run: ./build/ci/build.sh -a build env: diff --git a/Makefile.am b/Makefile.am index 96f6aeaed..43d022d73 100644 --- a/Makefile.am +++ b/Makefile.am @@ -807,6 +807,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_7zip_lzma2.7z.uu \ libarchive/test/test_read_format_7zip_lzma2_arm64.7z.uu \ libarchive/test/test_read_format_7zip_lzma2_arm.7z.uu \ + libarchive/test/test_read_format_7zip_lzma2_riscv.7z.uu \ libarchive/test/test_read_format_7zip_lzma2_sparc.7z.uu \ libarchive/test/test_read_format_7zip_malformed.7z.uu \ libarchive/test/test_read_format_7zip_malformed2.7z.uu \ diff --git a/libarchive/archive_read_support_format_7zip.c b/libarchive/archive_read_support_format_7zip.c index 62e9a2b1c..7bc1c6a31 100644 --- a/libarchive/archive_read_support_format_7zip.c +++ b/libarchive/archive_read_support_format_7zip.c @@ -83,6 +83,7 @@ #define _7Z_ARM 0x03030501 #define _7Z_ARMTHUMB 0x03030701 #define _7Z_ARM64 0xa +#define _7Z_RISCV 0xb #define _7Z_SPARC 0x03030805 #define _7Z_ZSTD 0x4F71101 /* Copied from https://github.com/mcmilk/7-Zip-zstd.git */ @@ -1225,6 +1226,12 @@ init_decompression(struct archive_read *a, struct _7zip *zip, filters[fi].id = LZMA_FILTER_ARM64; fi++; break; +#endif +#ifdef LZMA_FILTER_RISCV + case _7Z_RISCV: + filters[fi].id = LZMA_FILTER_RISCV; + fi++; + break; #endif case _7Z_SPARC: filters[fi].id = LZMA_FILTER_SPARC; @@ -1398,6 +1405,7 @@ init_decompression(struct archive_read *a, struct _7zip *zip, case _7Z_ARM: case _7Z_ARMTHUMB: case _7Z_ARM64: + case _7Z_RISCV: case _7Z_SPARC: case _7Z_DELTA: archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, diff --git a/libarchive/test/test_read_format_7zip.c b/libarchive/test/test_read_format_7zip.c index c79a6e575..e67427500 100644 --- a/libarchive/test/test_read_format_7zip.c +++ b/libarchive/test/test_read_format_7zip.c @@ -1314,6 +1314,63 @@ DEFINE_TEST(test_read_format_7zip_extract_second) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +#ifdef LZMA_FILTER_RISCV +static void +test_riscv_filter(const char *refname) +{ + struct archive *a; + struct archive_entry *ae; + char buff[8488]; + uint32_t computed_crc = 0; + uint32_t expected_crc = 0xf7ed24e7; + + assert((a = archive_read_new()) != NULL); + + extract_reference_file(refname); + + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt((AE_IFREG | 0775), archive_entry_mode(ae)); + assertEqualString("hw-riscv64", archive_entry_pathname(ae)); + assertEqualInt(sizeof(buff), archive_entry_size(ae)); + assertEqualInt(sizeof(buff), archive_read_data(a, buff, sizeof(buff))); + + computed_crc = crc32(computed_crc, buff, sizeof(buff)); + assertEqualInt(computed_crc, expected_crc); + + assertEqualInt(1, archive_file_count(a)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} +#endif + +DEFINE_TEST(test_read_format_7zip_lzma2_riscv) +{ +#ifdef LZMA_FILTER_RISCV + struct archive *a; + + assert((a = archive_read_new()) != NULL); + + if (ARCHIVE_OK != archive_read_support_filter_lzma(a)) { + skipping("7zip:lzma decoding is not supported on this platform"); + } else { + test_riscv_filter("test_read_format_7zip_lzma2_riscv.7z"); + } +#else + skipping("This version of liblzma does not support LZMA_FILTER_RISCV"); +#endif +} + static void test_sparc_filter(const char *refname) { diff --git a/libarchive/test/test_read_format_7zip_lzma2_riscv.7z.uu b/libarchive/test/test_read_format_7zip_lzma2_riscv.7z.uu new file mode 100644 index 000000000..5f1e8fb7d --- /dev/null +++ b/libarchive/test/test_read_format_7zip_lzma2_riscv.7z.uu @@ -0,0 +1,49 @@ +begin 664 test_read_format_7zip_lzma2_riscv.7z +M-WJ\KR<<``2#$,U9>P<```````!B`````````/NM+,3@(2<'5VNZVMMC.M1:6A'_@4B7D:$-^A7OC]^75)8S5[+EBS'O"X%U.;J +MIP3!?I?]\-&D0*0_ +M8\P?X^=GN)?^"&< +M8F?3+:T?=0[F$8D0,>.@/W@?.H_*3R#+OM.JM\::8JT52"_:`"T^IFT#HJ&E +MG?=B5!4EX?D"/N"[9/+^W956RS)T4MN,MPSU'BH$'6>.O!%>MM[Q1M\*?-:,ZA.LC4S*%X\>2A +M`A!MM\`L.#S5]OZSD.^1E^WI&^?6F,*]*G."0CI6H8W.9"#Z_6ZN<@;G-2.= +MT][M[&X3["?7[V$_E354K.RAM%W%]K=@-LG+<"*P\S=2`=&JS5Y(DY7CT!03 +MHW%SJ900'-CH(?!5OE0H$4K#Z(2OI<]5&X]"W)0TM&W$$F3GQ;,]!=OAC50% +M0^&+<+E;OMQ$NM:OT+PBPC.UIS`9V##GY2Q!&\VMUPK.(]I:2^O=\&*_+P2` +MSQ;RDC)U?8.'V.H3CD<%HEJFBY@;9B.?>RSO`Z*LF3IYHBM#W"L')Q8P*'5$ +MI:[H>M4CA0P,'R?M%_JJIKVCEK0L=U<&@>F8]L'_HK6W*/B7\WE^E8NL5 +M+I?\#G/4K>2*9==_\M[[L0]5+C",0H-Q]@"S>,%VY+S&9RV_!NCCNRF8KO6( +M28T%N->@QV&8E^W3$.1)I=N?7?EJJSC9/2,Q6"RQ1D!EYW_2]['@E-]V66+= +MX+Y:#/L9;[2A/3DB2BM[%M73D]L=*T8RO&7\@Z7?RP]2SH52\,/YJ[5R5U%+ +M\C@I[JTT!7[J)502-;,3_4CD1LZ/[*M()M=BD%P8[$]0H=F[=E:3WCZZPVGS +MD>(O_"VNIFCO;2\>S;\4GE8,#'FKL+O'E999,FO+U +M7<$4N)[FL%?263W@TVD]/=,)<[Z9USX_P:N+(U@S[()YQ\?5,[P*IF0`EX<@ +M^.GX!Z\?!M76Q]9KJ.5J2VHC579C,X1RIE<60O#5%:9',_ +M*B24>2\83;TIM&K.XR'DB*?&[E[R*%\:Q[[G[7`KF`F5F"GRR;%3/96U +M:,#>O*5M0,2^<..K%T*'C#.7>S8QPK;]>GJ20ZB]&P#K+\XL)Z!%).]9:1]) +MR\1H[/]I:U!ZX)^D+H-_B%48^]$&^>W09_2LD?(7X_,?`I%F(ZYPQVGI(><\ +M)S;)H(Z3?+J.>U1-^.1=Y_!_[\AU;E=5CTIR`9EED2T]PYY@&97N0+EW$`C5 +M50K)B)UG(Z5[<"$Y]:/>WF)'F4:'`\G^6@>.C_Q&S$7X(#A#:\HHDPNA3&Q[ +MGN._G\F.-KJD/R9IWQ#JQ3DBJX.RC+-W#,%&5$-W^>:=^63U;.?UHG"+IEJ< +MM^F2KMRWL)07J'E:JU:B@6KD-2X@J&32G>R_PV +MSJ\"11HX4^R3--6FN`]3E9[S\+$U!X0VOR)N1;HN#Y_Y&M2WYN`X)<(>`&W0 +M2SN#@M8>+=04++7&-!FD76*=WO:L99[,FZL> +MO#5R7EMF=ZWCA#?>]5C)I=_E1H^SDQX72:*)?L)AVKW"Z=S\8$7;;"1R0H51 +M5I@-MLZ()+]B88&)P^C^S;8D62W$"V.Z-GU"DI\TBOGK&8BW*H4LOMG])),V +MD\436(;$T\J.LQ[-]\&@2@!_UAZ\'\6,*A"R[6_QUV7%5=0M40X<0!#PYXZ' +MZ":.-1>U'DD=JHOL]XD5B5K[/^D;$VQ6YD\E(L)O2SX*B?/\!KG%A>^4)"'P +M9O\TIJ'OF%R%G7)H99X0_6_YDG$`RV4+ZNU**RUAOWUCW'6S(%)KCB&FT*J* +M`&0U;``BUN4KQ<01(`"X)ED'5'57KXT,%'-!\.D71?[:@&6;[$X$SBATYB;" +M7RH6L$VOJWCPADUR@>/DE]Y+FY'CP8*DV8XJO<;,.8,$EX:32RB_\T]13VFQ +M<+#:+Z2/"T_B-````00&``$)AWL`!PL!``(A(0$#`0L!``RA**$H``@*`>