170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. --- a/squashfs-tools/squashfs_fs.h
  2. +++ b/squashfs-tools/squashfs_fs.h
  3. @@ -30,6 +30,13 @@
  4. #define SQUASHFS_MAGIC_SWAP 0x68737173
  5. #define SQUASHFS_START 0
  6. +/*
  7. + * Squashfs + LZMA
  8. + */
  9. +
  10. +#define SQUASHFS_MAGIC_LZMA 0x71736873
  11. +#define SQUASHFS_MAGIC_LZMA_SWAP 0x73687371
  12. +
  13. /* size of metadata (inode and directory) blocks */
  14. #define SQUASHFS_METADATA_SIZE 8192
  15. #define SQUASHFS_METADATA_LOG 13
  16. --- a/squashfs-tools/unsquashfs.c
  17. +++ b/squashfs-tools/unsquashfs.c
  18. @@ -1463,10 +1463,12 @@ int read_super(char *source)
  19. */
  20. read_fs_bytes(fd, SQUASHFS_START, sizeof(struct squashfs_super_block),
  21. &sBlk_4);
  22. - swap = sBlk_4.s_magic != SQUASHFS_MAGIC;
  23. + swap = (sBlk_4.s_magic != SQUASHFS_MAGIC &&
  24. + sBlk_4.s_magic != SQUASHFS_MAGIC_LZMA);
  25. SQUASHFS_INSWAP_SUPER_BLOCK(&sBlk_4);
  26. - if(sBlk_4.s_magic == SQUASHFS_MAGIC && sBlk_4.s_major == 4 &&
  27. + if((sBlk_4.s_magic == SQUASHFS_MAGIC ||
  28. + sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) && sBlk_4.s_major == 4 &&
  29. sBlk_4.s_minor == 0) {
  30. s_ops.squashfs_opendir = squashfs_opendir_4;
  31. s_ops.read_fragment = read_fragment_4;
  32. @@ -1479,7 +1481,11 @@ int read_super(char *source)
  33. /*
  34. * Check the compression type
  35. */
  36. - comp = lookup_compressor_id(sBlk.s.compression);
  37. + if (sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA)
  38. + comp = lookup_compressor("lzma");
  39. + else
  40. + comp = lookup_compressor_id(sBlk.s.compression);
  41. +
  42. return TRUE;
  43. }
  44. @@ -1494,8 +1500,10 @@ int read_super(char *source)
  45. * Check it is a SQUASHFS superblock
  46. */
  47. swap = 0;
  48. - if(sBlk_3.s_magic != SQUASHFS_MAGIC) {
  49. - if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP) {
  50. + if(sBlk_3.s_magic != SQUASHFS_MAGIC &&
  51. + sBlk_3.s_magic != SQUASHFS_MAGIC_LZMA) {
  52. + if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP ||
  53. + sBlk_3.s_magic == SQUASHFS_MAGIC_LZMA_SWAP) {
  54. squashfs_super_block_3 sblk;
  55. ERROR("Reading a different endian SQUASHFS filesystem "
  56. "on %s\n", source);
  57. @@ -1573,7 +1581,11 @@ int read_super(char *source)
  58. /*
  59. * 1.x, 2.x and 3.x filesystems use gzip compression.
  60. */
  61. - comp = lookup_compressor("gzip");
  62. + if (sBlk.s.s_magic == SQUASHFS_MAGIC_LZMA)
  63. + comp = lookup_compressor("lzma");
  64. + else
  65. + comp = lookup_compressor("gzip");
  66. +
  67. return TRUE;
  68. failed_mount: