diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fd0d562e..6ff39609 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,7 +25,7 @@ jobs: toolchain: - stable # msrv - - 1.65.0 + - 1.66.0 features: # default features - @@ -51,7 +51,7 @@ jobs: toolchain: - stable # msrv - - 1.65.0 + - 1.66.0 features: - --no-default-features --features xz - --no-default-features --features gzip @@ -68,22 +68,6 @@ jobs: toolchain: ${{ matrix.toolchain }} - run: RUST_LOG=info cargo test --release ${{ matrix.features }} --locked --features __test_unsquashfs - - # benchmark - benchmark: - runs-on: ubuntu-latest - strategy: - matrix: - toolchain: - - stable - - steps: - - uses: actions/checkout@v3 - - uses: dtolnay/rust-toolchain@master - with: - toolchain: ${{ matrix.toolchain }} - - run: cargo bench - # fmt and clippy on stable fmt-clippy-stable: runs-on: ubuntu-latest diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 00000000..d6ecd332 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,16 @@ +on: [pull_request] +name: CI Pull Request +jobs: + runBenchmark: + name: Benchmark + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: dtolnay/rust-toolchain@stable + - uses: boa-dev/criterion-compare-action@v3 + with: + benchName: "benchmark" + branchName: ${{ github.base_ref }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/Cargo.lock b/Cargo.lock index 8f3da3bf..c6c32622 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,16 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "acid_io" +version = "0.1.0" +source = "git+https://github.com/dataphract/acid_io.git#2d549317fe9253df8b510ba6bbdcfe623a837286" +dependencies = [ + "byteorder", + "libc", + "memchr", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,9 +20,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -58,9 +68,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "c677ab05e09154296dd37acecd46420c17b9713e8366facafa8fc0885167cf4c" dependencies = [ "anstyle", "windows-sys 0.48.0", @@ -68,9 +78,9 @@ dependencies = [ [[package]] name = "assert_cmd" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d6b683edf8d1119fe420a94f8a7e389239666aa72e65495d91c00462510151" +checksum = "88903cb14723e4d4003335bb7f8a14f27691649105346a0f0957466c096adfe6" dependencies = [ "anstream", "anstyle", @@ -105,17 +115,19 @@ version = "0.13.0" dependencies = [ "assert_cmd", "byte-unit", - "clap 4.3.10", + "clap 4.3.22", "clap_complete", "console", "criterion", "deku", "dir-diff", + "document-features", "env_logger", "flate2", "indicatif", "jemallocator", "libc", + "log", "nix", "rayon", "rust-lzo", @@ -145,9 +157,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" [[package]] name = "bitvec" @@ -172,13 +184,12 @@ dependencies = [ [[package]] name = "bstr" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", - "once_cell", - "regex-automata", + "regex-automata 0.3.6", "serde", ] @@ -198,6 +209,12 @@ dependencies = [ "utf8-width", ] +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "cast" version = "0.3.0" @@ -206,11 +223,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.79" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -232,9 +250,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.10" +version = "4.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384e169cc618c613d5e3ca6404dda77a8685a63e08660dcc64abaf7da7cb0c7a" +checksum = "b417ae4361bca3f5de378294fc7472d3c4ed86a5ef9f49e93ae722f432aae8d2" dependencies = [ "clap_builder", "clap_derive", @@ -243,9 +261,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.10" +version = "4.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef137bbe35aab78bdb468ccfba75a5f4d8321ae011d34063770780545176af2d" +checksum = "9c90dc0f0e42c64bff177ca9d7be6fcc9ddb0f26a6e062174a61c84dd6c644d4" dependencies = [ "anstream", "anstyle", @@ -256,23 +274,23 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.3.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6b5c519bab3ea61843a7923d074b04245624bb84a64a8c150f5deb014e388b" +checksum = "5fc443334c81a804575546c5a8a79b4913b50e28d69232903604cada1de817ce" dependencies = [ - "clap 4.3.10", + "clap 4.3.22", ] [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -302,9 +320,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -466,9 +484,9 @@ dependencies = [ [[package]] name = "deku" version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819b87cc7a05b3abe3fc38e59b3980a5fd3162f25a247116441a9171d3e84481" +source = "git+https://github.com/sharksforarms/deku?branch=impl-reader#19ee68779f7ba0ef5670a649190ab823456a0e42" dependencies = [ + "acid_io", "bitvec", "deku_derive", ] @@ -476,8 +494,7 @@ dependencies = [ [[package]] name = "deku_derive" version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2ca12572239215a352a74ad7c776d7e8a914f8a23511c6cbedddd887e5009e" +source = "git+https://github.com/sharksforarms/deku?branch=impl-reader#19ee68779f7ba0ef5670a649190ab823456a0e42" dependencies = [ "darling", "proc-macro-crate", @@ -516,11 +533,20 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "document-features" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e493c573fce17f00dcab13b6ac057994f3ce17d1af4dc39bfd482b83c6eb6157" +dependencies = [ + "litrs", +] + [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encode_unicode" @@ -543,15 +569,15 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -570,18 +596,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", "miniz_oxide", @@ -647,9 +670,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "humantime" @@ -685,9 +708,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.5" +version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ff8cc23a7393a397ed1d7f56e6365cba772aba9f9912ab968b03043c395d057" +checksum = "0b297dc40733f23a0e52728a58fa9489a5b7638a324932de16b41adc3ef80730" dependencies = [ "console", "instant", @@ -711,19 +734,19 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", "windows-sys 0.48.0", ] [[package]] name = "is-terminal" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24fddda5af7e54bf7da53067d6e802dbcc381d0a8eef629df528e3ebf68755cb" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.1", - "rustix 0.38.1", + "hermit-abi 0.3.2", + "rustix 0.38.8", "windows-sys 0.48.0", ] @@ -738,15 +761,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jemalloc-sys" -version = "0.5.3+5.3.0-patched" +version = "0.5.4+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bd5d616ea7ed58b571b2e209a65759664d7fb021a0819d7a790afc67e47ca1" +checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" dependencies = [ "cc", "libc", @@ -754,9 +777,9 @@ dependencies = [ [[package]] name = "jemallocator" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c2514137880c52b0b4822b563fadd38257c1f380858addb74a400889696ea6" +checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" dependencies = [ "jemalloc-sys", "libc", @@ -800,15 +823,21 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.3" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" + +[[package]] +name = "litrs" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "f9275e0933cf8bb20f008924c0cb07a0692fe54d8064996520bf998de9eb79aa" [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lzma-sys" @@ -827,7 +856,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -878,9 +907,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] @@ -891,7 +920,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", ] @@ -927,9 +956,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pkg-config" @@ -967,9 +996,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.3.3" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "767eb9f07d4a5ebcb39bbf2d452058a93c011373abf6832e24194a1c3f004794" +checksum = "f32154ba0af3a075eefa1eda8bb414ee928f62303a54ea85b8d6638ff1a6ee9e" [[package]] name = "predicates" @@ -1011,18 +1040,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.63" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.29" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1066,13 +1095,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.4" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.2", + "regex-automata 0.3.6", + "regex-syntax 0.7.4", ] [[package]] @@ -1084,6 +1114,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -1092,9 +1133,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "ring" @@ -1128,9 +1169,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.37.21" +version = "0.37.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25693a73057a1b4cb56179dd3c7ea21a7c6c5ee7d85781f5749b46f34b79c" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" dependencies = [ "bitflags 1.3.2", "errno", @@ -1142,26 +1183,26 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.1" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc6396159432b5c8490d4e301d8c705f61860b8b6c863bf79942ce5401968f3" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.0", "errno", "libc", - "linux-raw-sys 0.4.3", + "linux-raw-sys 0.4.5", "windows-sys 0.48.0", ] [[package]] name = "rustls" -version = "0.21.2" +version = "0.21.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", - "rustls-webpki", + "rustls-webpki 0.101.3", "sct", ] @@ -1175,11 +1216,21 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.101.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "261e9e0888cba427c3316e6322805653c9425240b6fd96cee7cb671ab70ab8d0" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -1192,9 +1243,9 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -1208,9 +1259,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.164" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" [[package]] name = "serde_cbor" @@ -1224,20 +1275,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] name = "serde_json" -version = "1.0.99" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa", "ryu", @@ -1266,15 +1317,15 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "spin" @@ -1307,9 +1358,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.22" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -1324,15 +1375,14 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" dependencies = [ - "autocfg", "cfg-if", "fastrand", "redox_syscall", - "rustix 0.37.21", + "rustix 0.38.8", "windows-sys 0.48.0", ] @@ -1351,7 +1401,7 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" dependencies = [ - "rustix 0.37.21", + "rustix 0.37.23", "windows-sys 0.48.0", ] @@ -1392,22 +1442,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -1453,9 +1503,9 @@ checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.11" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ "indexmap", "toml_datetime", @@ -1482,7 +1532,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.29", ] [[package]] @@ -1538,9 +1588,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1574,7 +1624,7 @@ dependencies = [ "log", "once_cell", "rustls", - "rustls-webpki", + "rustls-webpki 0.100.1", "url", "webpki-roots", ] @@ -1654,7 +1704,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -1676,7 +1726,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1703,7 +1753,7 @@ version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" dependencies = [ - "rustls-webpki", + "rustls-webpki 0.100.1", ] [[package]] @@ -1752,7 +1802,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.3", ] [[package]] @@ -1772,17 +1822,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "27f51fb4c64f8b770a823c043c7fad036323e1c48f55287b7bbb7987b2fcdf3b" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.3", + "windows_aarch64_msvc 0.48.3", + "windows_i686_gnu 0.48.3", + "windows_i686_msvc 0.48.3", + "windows_x86_64_gnu 0.48.3", + "windows_x86_64_gnullvm 0.48.3", + "windows_x86_64_msvc 0.48.3", ] [[package]] @@ -1793,9 +1843,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "fde1bb55ae4ce76a597a8566d82c57432bc69c039449d61572a7a353da28f68c" [[package]] name = "windows_aarch64_msvc" @@ -1805,9 +1855,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "1513e8d48365a78adad7322fd6b5e4c4e99d92a69db8df2d435b25b1f1f286d4" [[package]] name = "windows_i686_gnu" @@ -1817,9 +1867,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "60587c0265d2b842298f5858e1a5d79d146f9ee0c37be5782e92a6eb5e1d7a83" [[package]] name = "windows_i686_msvc" @@ -1829,9 +1879,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "224fe0e0ffff5d2ea6a29f82026c8f43870038a0ffc247aa95a52b47df381ac4" [[package]] name = "windows_x86_64_gnu" @@ -1841,9 +1891,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "62fc52a0f50a088de499712cbc012df7ebd94e2d6eb948435449d76a6287e7ad" [[package]] name = "windows_x86_64_gnullvm" @@ -1853,9 +1903,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "2093925509d91ea3d69bcd20238f4c2ecdb1a29d3c281d026a09705d0dd35f3d" [[package]] name = "windows_x86_64_msvc" @@ -1865,15 +1915,15 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "b6ade45bc8bf02ae2aa34a9d54ba660a1a58204da34ba793c00d83ca3730b5f1" [[package]] name = "winnow" -version = "0.4.7" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97" dependencies = [ "memchr", ] @@ -1898,18 +1948,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.12.3+zstd.1.5.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" +checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.5+zstd.1.5.4" +version = "6.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" +checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" dependencies = [ "libc", "zstd-sys", diff --git a/Cargo.toml b/Cargo.toml index 75a25096..2b6279d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ name = "backhand" repository = "https://github.com/wcampbell0x2a/backhand" version = "0.13.0" edition = "2021" -rust-version = "1.65.0" +rust-version = "1.66.0" license = "MIT OR Apache-2.0" authors = ["wcampbell "] description = "Library for the reading, creating, and modification of SquashFS file systems" @@ -12,7 +12,7 @@ categories = ["filesystem", "parsing"] [dependencies] # for lib -deku = "0.16.0" +deku = { git = "https://github.com/sharksforarms/deku", branch = "impl-reader" } tracing = "0.1.37" thiserror = "1.0.37" flate2 = { version = "1.0.24", optional = true } @@ -31,16 +31,22 @@ clap_complete = "4.2.1" indicatif = "0.17.5" console = "0.15.7" rayon = "1.7.0" +log = "0.4.19" +document-features = "0.2.7" [features] default = ["xz", "gzip", "zstd"] +## Enables xz compression inside library and binaries xz = ["dep:xz2"] +## Enables xz compression and forces static build inside library and binaries xz-static = ["dep:xz2", "xz2?/static"] +## Enables gzip compression inside library and binaries gzip = ["dep:flate2"] -# this library is licensed GPL and thus disabled by default +## This library is licensed GPL and thus disabled by default lzo = ["dep:rust-lzo"] +## Enables zstd compression inside library and binaries zstd = ["dep:zstd"] -# testing only feature for testing vs squashfs-tools/unsquashfs +### testing only feature for testing vs squashfs-tools/unsquashfs __test_unsquashfs = [] [dev-dependencies] diff --git a/README.md b/README.md index f7cb3ab9..917b4549 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ This allows changing the magic bytes, custom compression algorithms, and the End ## Library -*Compiler support: requires rustc 1.65+* +*Compiler support: requires rustc 1.66+* Add the following to your `Cargo.toml` file: ```toml diff --git a/src/compressor.rs b/src/compressor.rs index 27fbf68c..3e6935be 100644 --- a/src/compressor.rs +++ b/src/compressor.rs @@ -87,9 +87,9 @@ pub struct Xz { // TODO: in openwrt, git-hash:f97ad870e11ebe5f3dcf833dda6c83b9165b37cb shows that before // offical squashfs-tools had xz support they had the dictionary_size field as the last field // in this struct. If we get test images, I guess we can support this in the future. - #[deku(cond = "!deku::rest.is_empty()")] + #[deku(cond = "!deku::reader.end()")] pub bit_opts: Option, - #[deku(cond = "!deku::rest.is_empty()")] + #[deku(cond = "!deku::reader.end()")] pub fb: Option, } diff --git a/src/lib.rs b/src/lib.rs index 2dabb083..0504f366 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -48,6 +48,9 @@ //! let mut output = File::create("modified.squashfs").unwrap(); //! write_filesystem.write(&mut output).unwrap(); //! ``` +//! +//! ## Feature flags +#![doc = document_features::document_features!()] #[doc = include_str!("../README.md")] type _ReadmeTest = (); diff --git a/src/metadata.rs b/src/metadata.rs index bc772cd0..b8341ce3 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -1,7 +1,7 @@ use std::collections::VecDeque; -use std::io::{self, Read, Seek, Write}; +use std::io::{self, Cursor, Read, Seek, Write}; -use deku::bitvec::{BitVec, BitView}; +use deku::bitvec::BitVec; use deku::prelude::*; use tracing::{instrument, trace}; @@ -127,12 +127,13 @@ pub fn read_block( superblock: &SuperBlock, kind: &Kind, ) -> Result, BackhandError> { - let mut buf = [0u8; 2]; - reader.read_exact(&mut buf)?; + let buf: &mut [u8] = &mut [0u8; 2]; + reader.read_exact(buf)?; - let bv = buf.view_bits::(); trace!("{:02x?}", buf); - let (_, metadata_len) = u16::read(bv, kind.inner.data_endian)?; + let mut cursor = Cursor::new(buf); + let mut deku_reader = Reader::new(&mut cursor); + let metadata_len = u16::from_reader_with_ctx(&mut deku_reader, kind.inner.data_endian)?; let byte_len = len(metadata_len); tracing::trace!("len: 0x{:02x?}", byte_len); diff --git a/src/reader.rs b/src/reader.rs index 9576d2dc..64705fb1 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -1,9 +1,8 @@ //! Reader traits use std::collections::HashMap; -use std::io::{BufRead, Read, Seek, SeekFrom, Write}; +use std::io::{BufRead, Cursor, Read, Seek, SeekFrom, Write}; -use deku::bitvec::{BitView, Msb0}; use deku::prelude::*; use rustc_hash::FxHashMap; use tracing::{error, instrument, trace}; @@ -103,25 +102,28 @@ pub trait SquashFsReader: BufReadSeek { // Using this size, a SquashFS reader can determine if another header with further entries // should be following once it reaches the end of a run. - let mut ret_bytes = Vec::with_capacity(METADATA_MAXSIZE); + let mut next = vec![]; let mut metadata_offsets = vec![]; let mut ret_vec = HashMap::default(); let start = self.stream_position()?; while self.stream_position()? < superblock.dir_table { - trace!("offset: {:02x?}", self.stream_position()); metadata_offsets.push(self.stream_position()? - start); // parse into metadata let mut bytes = metadata::read_block(self, superblock, kind)?; // parse as many inodes as you can - ret_bytes.append(&mut bytes); - - let mut input_bits = ret_bytes.view_bits::(); - while !input_bits.is_empty() { - match Inode::read( - input_bits, + let mut inode_bytes = next; + inode_bytes.append(&mut bytes); + let mut c_inode_bytes = Cursor::new(inode_bytes.clone()); + let mut container = Reader::new(&mut c_inode_bytes); + + // store last successful read position + let mut container_bits_read = container.bits_read; + loop { + match Inode::from_reader_with_ctx( + &mut container, ( superblock.bytes_used, superblock.block_size, @@ -129,21 +131,22 @@ pub trait SquashFsReader: BufReadSeek { kind.inner.type_endian, ), ) { - Ok((rest, inode)) => { + Ok(inode) => { // Push the new Inode to the return, with the position this was read from ret_vec.insert(inode.header.inode_number, inode); - input_bits = rest; + container_bits_read = container.bits_read; } - Err(_) => { - // try next block, inodes can span multiple blocks! - break; + Err(e) => { + if matches!(e, DekuError::Incomplete(_)) { + // try next block, inodes can span multiple blocks! + next = inode_bytes.clone()[(container_bits_read / 8)..].to_vec(); + break; + } else { + panic!("{:?}", e); + } } } } - - // save leftover bits to new bits to leave for the next metadata block - // this is safe, input_bits is always byte aligned - ret_bytes.drain(..(ret_bytes.len() - (input_bits.len() / 8))); } Ok(ret_vec) @@ -171,10 +174,10 @@ pub trait SquashFsReader: BufReadSeek { error!("root_inode_offset > bytes.len()"); return Err(BackhandError::CorruptedOrInvalidSquashfs); } - let new_bytes = &bytes_01[root_inode_offset..]; - let input_bits = new_bytes.view_bits::<::deku::bitvec::Msb0>(); - if let Ok((_, inode)) = Inode::read( - input_bits, + let mut cursor = Cursor::new(&bytes_01[root_inode_offset..]); + let mut new_bytes = Reader::new(&mut cursor); + if let Ok(inode) = Inode::from_reader_with_ctx( + &mut new_bytes, ( superblock.bytes_used, superblock.block_size, @@ -192,11 +195,11 @@ pub trait SquashFsReader: BufReadSeek { error!("root_inode_offset > bytes.len()"); return Err(BackhandError::CorruptedOrInvalidSquashfs); } - let new_bytes = &bytes_01[root_inode_offset..]; - let input_bits = new_bytes.view_bits::<::deku::bitvec::Msb0>(); - match Inode::read( - input_bits, + let mut cursor = Cursor::new(&bytes_01[root_inode_offset..]); + let mut new_bytes = Reader::new(&mut cursor); + match Inode::from_reader_with_ctx( + &mut new_bytes, ( superblock.bytes_used, superblock.block_size, @@ -204,7 +207,7 @@ pub trait SquashFsReader: BufReadSeek { kind.inner.type_endian, ), ) { - Ok((_, inode)) => Ok(inode), + Ok(inode) => Ok(inode), Err(e) => Err(e.into()), } } @@ -281,22 +284,26 @@ pub trait SquashFsReader: BufReadSeek { /// Parse Lookup Table #[instrument(skip_all)] - fn lookup_table DekuRead<'a, deku::ctx::Endian>>( + fn lookup_table( &mut self, superblock: &SuperBlock, seek: u64, size: u64, kind: &Kind, - ) -> Result<(u64, Vec), BackhandError> { + ) -> Result<(u64, Vec), BackhandError> + where + T: for<'a> DekuReader<'a, deku::ctx::Endian>, + { // find the pointer at the initial offset trace!("seek: {:02x?}", seek); self.seek(SeekFrom::Start(seek))?; - let mut buf = [0u8; 8]; - self.read_exact(&mut buf)?; + let buf: &mut [u8] = &mut [0u8; 8]; + self.read_exact(buf)?; trace!("{:02x?}", buf); - let bv = buf.view_bits::(); - let (_, ptr) = u64::read(bv, kind.inner.type_endian)?; + let mut cursor = Cursor::new(buf); + let mut deku_reader = Reader::new(&mut cursor); + let ptr = u64::from_reader_with_ctx(&mut deku_reader, kind.inner.type_endian)?; let block_count = (size as f32 / METADATA_MAXSIZE as f32).ceil() as u64; @@ -309,13 +316,16 @@ pub trait SquashFsReader: BufReadSeek { /// Parse count of `Metadata` block at offset into `T` #[instrument(skip_all)] - fn metadata_with_count DekuRead<'a, deku::ctx::Endian>>( + fn metadata_with_count( &mut self, superblock: &SuperBlock, seek: u64, count: u64, kind: &Kind, - ) -> Result, BackhandError> { + ) -> Result, BackhandError> + where + T: for<'a> DekuReader<'a, deku::ctx::Endian>, + { trace!("seek: {:02x?}", seek); self.seek(SeekFrom::Start(seek))?; @@ -326,11 +336,11 @@ pub trait SquashFsReader: BufReadSeek { } let mut ret_vec = vec![]; - let mut all_bytes = all_bytes.view_bits::(); // Read until we fail to turn bytes into `T` - while let Ok((rest, t)) = T::read(all_bytes, kind.inner.type_endian) { + let mut cursor = Cursor::new(all_bytes); + let mut container = Reader::new(&mut cursor); + while let Ok(t) = T::from_reader_with_ctx(&mut container, kind.inner.type_endian) { ret_vec.push(t); - all_bytes = rest; } Ok(ret_vec) diff --git a/src/squashfs.rs b/src/squashfs.rs index fd82921b..a1b0eaf7 100644 --- a/src/squashfs.rs +++ b/src/squashfs.rs @@ -1,13 +1,12 @@ //! Read from on-disk image use std::ffi::OsString; -use std::io::{Seek, SeekFrom}; +use std::io::{Cursor, Seek, SeekFrom}; use std::os::unix::prelude::OsStringExt; use std::path::PathBuf; use std::sync::Arc; use std::sync::Mutex; -use deku::bitvec::{BitVec, BitView, Msb0}; use deku::prelude::*; use rustc_hash::FxHashMap; use tracing::{error, info, instrument, trace}; @@ -220,19 +219,15 @@ impl Squashfs { /// Read Superblock and Compression Options at current `reader` offset without parsing inodes /// and dirs /// - /// Used for unsquashfs --stat + /// Used for unsquashfs (extraction and --stat) pub fn superblock_and_compression_options( reader: &mut Box, kind: &Kind, ) -> Result<(SuperBlock, Option), BackhandError> { - // Size of metadata + optional compression options metadata block - let mut superblock = [0u8; 96]; - reader.read_exact(&mut superblock)?; - // Parse SuperBlock - let bs = superblock.view_bits::(); - let (_, superblock) = SuperBlock::read( - bs, + let mut container = Reader::new(reader); + let superblock = SuperBlock::from_reader_with_ctx( + &mut container, ( kind.inner.magic, kind.inner.version_major, @@ -260,16 +255,18 @@ impl Squashfs { { let bytes = metadata::read_block(reader, &superblock, kind)?; // data -> compression options - let bv = BitVec::from_slice(&bytes); - match CompressionOptions::read(&bv, (kind.inner.type_endian, superblock.compressor)) { + match CompressionOptions::from_reader_with_ctx( + &mut Reader::new(&mut Cursor::new(bytes)), + (kind.inner.type_endian, superblock.compressor), + ) { Ok(co) => { - if !co.0.is_empty() { - error!("invalid compression options, bytes left over, using"); - } - Some(co.1) + //if !co.0.is_empty() { + // error!("invalid compression options, bytes left over, using"); + //} + Some(co) } Err(e) => { - error!("invalid compression options: {e:?}[{bytes:02x?}], not using"); + error!("invalid compression options: {e:?}, not using"); None } } @@ -363,7 +360,7 @@ impl Squashfs { } // Read all fields from filesystem to make a Squashfs - info!("Reading Inodes"); + info!("Reading Inodes @ {:02x?}", superblock.inode_table); let inodes = reader.inodes(&superblock, &kind)?; info!("Reading Root Inode"); @@ -481,11 +478,11 @@ impl Squashfs { let bytes = &block[block_offset..][..file_size as usize - 3]; let mut dirs = vec![]; - let mut all_bytes = bytes.view_bits::(); // Read until we fail to turn bytes into `T` - while let Ok((rest, t)) = Dir::read(all_bytes, self.kind.inner.type_endian) { + let mut cursor = Cursor::new(bytes); + let mut container = Reader::new(&mut cursor); + while let Ok(t) = Dir::from_reader_with_ctx(&mut container, self.kind.inner.type_endian) { dirs.push(t); - all_bytes = rest; } trace!("finish");