source: trunk/tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch @ 28489

Last change on this file since 28489 was 28489, checked in by jogo, 5 years ago

squashfs4: Add support for LZMA Magic to unsquashfs

Some vendor firmwares use a different super block magic to indicate LZMA
compression. This patches adds support for detecting this and enable
extraction for those firmware's root filesystems.

File size: 2.2 KB
  • squashfs-tools/squashfs_fs.h

    a b  
    3030#define SQUASHFS_MAGIC_SWAP             0x68737173 
    3131#define SQUASHFS_START                  0 
    3232 
     33/* 
     34 * Squashfs + LZMA 
     35 */ 
     36 
     37#define SQUASHFS_MAGIC_LZMA             0x71736873 
     38#define SQUASHFS_MAGIC_LZMA_SWAP        0x73687371 
     39 
    3340/* size of metadata (inode and directory) blocks */ 
    3441#define SQUASHFS_METADATA_SIZE          8192 
    3542#define SQUASHFS_METADATA_LOG           13 
  • squashfs-tools/unsquashfs.c

    a b int read_super(char *source) 
    14631463         */ 
    14641464        read_fs_bytes(fd, SQUASHFS_START, sizeof(struct squashfs_super_block), 
    14651465                &sBlk_4); 
    1466         swap = sBlk_4.s_magic != SQUASHFS_MAGIC; 
     1466        swap = (sBlk_4.s_magic != SQUASHFS_MAGIC && 
     1467                sBlk_4.s_magic != SQUASHFS_MAGIC_LZMA); 
    14671468        SQUASHFS_INSWAP_SUPER_BLOCK(&sBlk_4); 
    14681469 
    1469         if(sBlk_4.s_magic == SQUASHFS_MAGIC && sBlk_4.s_major == 4 && 
     1470        if((sBlk_4.s_magic == SQUASHFS_MAGIC ||  
     1471           sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) && sBlk_4.s_major == 4 && 
    14701472                        sBlk_4.s_minor == 0) { 
    14711473                s_ops.squashfs_opendir = squashfs_opendir_4; 
    14721474                s_ops.read_fragment = read_fragment_4; 
    int read_super(char *source) 
    14791481                /* 
    14801482                 * Check the compression type 
    14811483                 */ 
    1482                 comp = lookup_compressor_id(sBlk.s.compression); 
     1484                if (sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) 
     1485                        comp = lookup_compressor("lzma"); 
     1486                else 
     1487                        comp = lookup_compressor_id(sBlk.s.compression); 
     1488 
    14831489                return TRUE; 
    14841490        } 
    14851491 
    int read_super(char *source) 
    14941500         * Check it is a SQUASHFS superblock 
    14951501         */ 
    14961502        swap = 0; 
    1497         if(sBlk_3.s_magic != SQUASHFS_MAGIC) { 
    1498                 if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP) { 
     1503        if(sBlk_3.s_magic != SQUASHFS_MAGIC &&  
     1504                        sBlk_3.s_magic != SQUASHFS_MAGIC_LZMA) { 
     1505                if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP ||  
     1506                                sBlk_3.s_magic == SQUASHFS_MAGIC_LZMA_SWAP) { 
    14991507                        squashfs_super_block_3 sblk; 
    15001508                        ERROR("Reading a different endian SQUASHFS filesystem " 
    15011509                                "on %s\n", source); 
    int read_super(char *source) 
    15731581        /* 
    15741582         * 1.x, 2.x and 3.x filesystems use gzip compression. 
    15751583         */ 
    1576         comp = lookup_compressor("gzip"); 
     1584        if (sBlk.s.s_magic == SQUASHFS_MAGIC_LZMA) 
     1585                comp = lookup_compressor("lzma"); 
     1586        else 
     1587                comp = lookup_compressor("gzip"); 
     1588 
    15771589        return TRUE; 
    15781590 
    15791591failed_mount: 
Note: See TracBrowser for help on using the repository browser.