From ad24995b7bb27dfbd7d2e9fa49a20fe769e8ac08 Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Mon, 17 Mar 2025 06:16:25 -0500 Subject: [PATCH] Change no_lzma and no_lzo to no_obsolete and no_gpl Added build tags section to README --- README.md | 4 +++ internal/decompress/get_decomp.go | 32 +++++++++++++++++ internal/decompress/get_decomp_no_gpl.go | 34 +++++++++++++++++++ .../decompress/get_decomp_no_gpl_obsolete.go | 34 +++++++++++++++++++ internal/decompress/get_decomp_no_obsolete.go | 34 +++++++++++++++++++ internal/decompress/lzma.go | 1 + internal/decompress/lzma_none.go | 12 ------- internal/decompress/lzo.go | 1 + internal/decompress/lzo_none.go | 12 ------- low/reader.go | 18 ++-------- 10 files changed, 143 insertions(+), 39 deletions(-) create mode 100644 internal/decompress/get_decomp.go create mode 100644 internal/decompress/get_decomp_no_gpl.go create mode 100644 internal/decompress/get_decomp_no_gpl_obsolete.go create mode 100644 internal/decompress/get_decomp_no_obsolete.go delete mode 100644 internal/decompress/lzma_none.go delete mode 100644 internal/decompress/lzo_none.go diff --git a/README.md b/README.md index 73e7767..3874485 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ Currently has support for reading squashfs files and extracting files and folder Special thanks to for some VERY important information in an easy to understand format. Thanks also to [distri's squashfs library](https://github.com/distr1/distri/tree/master/internal/squashfs) as I referenced it to figure some things out (and double check others). +## Build tags + +This library has two optional build tags. `no_gpl` disables the ability to read archives with lzo compression due to the library's gpl license. `no_obsolete` removes "obsolete" compression types for a reduced size; currently this only disable lzma compression. + ## FUSE As of `v1.0`, FUSE capabilities has been moved to [a separate library](https://github.com/CalebQ42/squashfuse). diff --git a/internal/decompress/get_decomp.go b/internal/decompress/get_decomp.go new file mode 100644 index 0000000..45c902c --- /dev/null +++ b/internal/decompress/get_decomp.go @@ -0,0 +1,32 @@ +package decompress + +import "errors" + +// The types of compression supported by squashfs +const ( + ZlibCompression = uint16(iota + 1) + LZMACompression + LZOCompression + XZCompression + LZ4Compression + ZSTDCompression +) + +func GetDecompressor(compType uint16) (Decompressor, error) { + switch compType { + case ZlibCompression: + return Zlib{}, nil + case LZMACompression: + return Lzma{}, nil + case LZOCompression: + return Lzo{}, nil + case XZCompression: + return Xz{}, nil + case LZ4Compression: + return Lz4{}, nil + case ZSTDCompression: + return &Zstd{}, nil + default: + return nil, errors.New("invalid compression type. possible corrupted archive") + } +} diff --git a/internal/decompress/get_decomp_no_gpl.go b/internal/decompress/get_decomp_no_gpl.go new file mode 100644 index 0000000..c6ab40f --- /dev/null +++ b/internal/decompress/get_decomp_no_gpl.go @@ -0,0 +1,34 @@ +//go:build no_gpl + +package decompress + +import "errors" + +// The types of compression supported by squashfs +const ( + ZlibCompression = uint16(iota + 1) + LZMACompression + LZOCompression + XZCompression + LZ4Compression + ZSTDCompression +) + +func GetDecompressor(compType uint16) (Decompressor, error) { + switch compType { + case ZlibCompression: + return Zlib{}, nil + case LZMACompression: + return Lzma{}, nil + case LZOCompression: + return nil, errors.New("lzo compression is disable in this build with no_gpl") + case XZCompression: + return Xz{}, nil + case LZ4Compression: + return Lz4{}, nil + case ZSTDCompression: + return &Zstd{}, nil + default: + return nil, errors.New("invalid compression type. possible corrupted archive") + } +} diff --git a/internal/decompress/get_decomp_no_gpl_obsolete.go b/internal/decompress/get_decomp_no_gpl_obsolete.go new file mode 100644 index 0000000..cb17867 --- /dev/null +++ b/internal/decompress/get_decomp_no_gpl_obsolete.go @@ -0,0 +1,34 @@ +//go:build no_obsolete + +package decompress + +import "errors" + +// The types of compression supported by squashfs +const ( + ZlibCompression = uint16(iota + 1) + LZMACompression + LZOCompression + XZCompression + LZ4Compression + ZSTDCompression +) + +func GetDecompressor(compType uint16) (Decompressor, error) { + switch compType { + case ZlibCompression: + return Zlib{}, nil + case LZMACompression: + return nil, errors.New("lzma compression is disable in this build with no_obsolete") + case LZOCompression: + return Lzo{}, nil + case XZCompression: + return Xz{}, nil + case LZ4Compression: + return Lz4{}, nil + case ZSTDCompression: + return &Zstd{}, nil + default: + return nil, errors.New("invalid compression type. possible corrupted archive") + } +} diff --git a/internal/decompress/get_decomp_no_obsolete.go b/internal/decompress/get_decomp_no_obsolete.go new file mode 100644 index 0000000..0a85d11 --- /dev/null +++ b/internal/decompress/get_decomp_no_obsolete.go @@ -0,0 +1,34 @@ +//go:build no_gpl && no_obsolete + +package decompress + +import "errors" + +// The types of compression supported by squashfs +const ( + ZlibCompression = uint16(iota + 1) + LZMACompression + LZOCompression + XZCompression + LZ4Compression + ZSTDCompression +) + +func GetDecompressor(compType uint16) (Decompressor, error) { + switch compType { + case ZlibCompression: + return Zlib{}, nil + case LZMACompression: + return nil, errors.New("lzma compression is disable in this build with no_obsolete") + case LZOCompression: + return nil, errors.New("lzo compression is disable in this build with no_gpl") + case XZCompression: + return Xz{}, nil + case LZ4Compression: + return Lz4{}, nil + case ZSTDCompression: + return &Zstd{}, nil + default: + return nil, errors.New("invalid compression type. possible corrupted archive") + } +} diff --git a/internal/decompress/lzma.go b/internal/decompress/lzma.go index f204b2a..74603f9 100644 --- a/internal/decompress/lzma.go +++ b/internal/decompress/lzma.go @@ -1,4 +1,5 @@ //go:build !no_lzma + package decompress import ( diff --git a/internal/decompress/lzma_none.go b/internal/decompress/lzma_none.go deleted file mode 100644 index 718127b..0000000 --- a/internal/decompress/lzma_none.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build no_lzma -package decompress - -import ( - "fmt" -) - -type Lzma struct{} - -func (l Lzma) Decompress(_ []byte) ([]byte, error) { - return nil, fmt.Errorf("lzma is not supported") -} diff --git a/internal/decompress/lzo.go b/internal/decompress/lzo.go index 74ab7b4..fd8d650 100644 --- a/internal/decompress/lzo.go +++ b/internal/decompress/lzo.go @@ -1,4 +1,5 @@ //go:build !no_lzo + package decompress import ( diff --git a/internal/decompress/lzo_none.go b/internal/decompress/lzo_none.go deleted file mode 100644 index 0901043..0000000 --- a/internal/decompress/lzo_none.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build no_lzo -package decompress - -import ( - "fmt" -) - -type Lzo struct{} - -func (l Lzo) Decompress(_ []byte) ([]byte, error) { - return nil, fmt.Errorf("lzo is not supported") -} diff --git a/low/reader.go b/low/reader.go index 1535dde..85e45d8 100644 --- a/low/reader.go +++ b/low/reader.go @@ -55,21 +55,9 @@ func NewReader(r io.ReaderAt) (rdr *Reader, err error) { if !rdr.Superblock.ValidVersion() { return nil, ErrorVersion } - switch rdr.Superblock.CompType { - case ZlibCompression: - rdr.d = decompress.Zlib{} - case LZMACompression: - rdr.d = decompress.Lzma{} - case LZOCompression: - rdr.d = decompress.Lzo{} - case XZCompression: - rdr.d = decompress.Xz{} - case LZ4Compression: - rdr.d = decompress.Lz4{} - case ZSTDCompression: - rdr.d = &decompress.Zstd{} - default: - return nil, errors.New("invalid compression type. possible corrupted archive") + rdr.d, err = decompress.GetDecompressor(rdr.Superblock.CompType) + if err != nil { + return nil, err } rdr.Root, err = rdr.directoryFromRef(rdr.Superblock.RootInodeRef, "") if err != nil {