]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: detect squashfs 3 vs 4
authorRuediger Meier <ruediger.meier@ga-group.nl>
Tue, 20 May 2014 10:23:33 +0000 (10:23 +0000)
committerKarel Zak <kzak@redhat.com>
Mon, 26 May 2014 10:00:44 +0000 (12:00 +0200)
Detect squashfs version <= 3 as squashfs3 and version >= 4 as squashfs.

squashfs kernel module version 4.0 (kernel 2.6.29) is not backward
compatible to open squashfs created with previous versions.

Also fixed version number parsing, see
$  mkdir test
$  mksquashfs test test.sqsh
$  blkid -p test.sqsh
- test.sqsh: VERSION="1024.0" TYPE="squashfs" USAGE="filesystem"
+ test.sqsh: VERSION="4.0" TYPE="squashfs" USAGE="filesystem"

This patch comes from openSUSE / SLE. Original author was probably
Miklos Szeredi.
Internal SUSE references: bnc#666893, sr226509

CC: Stanislav Brabec <sbrabec@suse.cz>
CC: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Ruediger Meier <ruediger.meier@ga-group.nl>
libblkid/src/superblocks/squashfs.c
libblkid/src/superblocks/superblocks.c
libblkid/src/superblocks/superblocks.h

index 595c8e22e0f822d2393805675a3ec7f91220bd70..a35d60faf05b3ad60948efbb0a1aa36097bc90a5 100644 (file)
@@ -31,20 +31,46 @@ struct sqsh_super_block {
 static int probe_squashfs(blkid_probe pr, const struct blkid_idmag *mag)
 {
        struct sqsh_super_block *sq;
+       uint16_t major;
+       uint16_t minor;
 
        sq = blkid_probe_get_sb(pr, mag, struct sqsh_super_block);
        if (!sq)
                return errno ? -errno : 1;
 
-       if (strcmp(mag->magic, "sqsh") == 0 ||
-           strcmp(mag->magic, "qshs") == 0)
-               blkid_probe_sprintf_version(pr, "%u.%u",
-                               sq->s_major,
-                               sq->s_minor);
-       else
-               blkid_probe_sprintf_version(pr, "%u.%u",
-                               swab16(sq->s_major),
-                               swab16(sq->s_minor));
+       major = le16_to_cpu(sq->s_major);
+       minor = le16_to_cpu(sq->s_minor);
+       if (major < 4)
+               return -1;
+
+       blkid_probe_sprintf_version(pr, "%u.%u", major, minor);
+
+       return 0;
+}
+
+static int probe_squashfs3(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       struct sqsh_super_block *sq;
+       uint16_t major;
+       uint16_t minor;
+
+       sq = blkid_probe_get_sb(pr, mag, struct sqsh_super_block);
+       if (!sq)
+               return -1;
+
+       if (strcmp(mag->magic, "sqsh") == 0) {
+               major = be16_to_cpu(sq->s_major);
+               minor = be16_to_cpu(sq->s_minor);
+       } else {
+               major = le16_to_cpu(sq->s_major);
+               minor = le16_to_cpu(sq->s_minor);
+       }
+
+       if (major > 3)
+               return -1;
+
+       blkid_probe_sprintf_version(pr, "%u.%u", major, minor);
+
        return 0;
 }
 
@@ -55,14 +81,21 @@ const struct blkid_idinfo squashfs_idinfo =
        .probefunc      = probe_squashfs,
        .magics         =
        {
-               { .magic = "sqsh", .len = 4 },
-               { .magic = "hsqs", .len = 4 }, /* swap */
-
-               /* LZMA version */
-               { .magic = "qshs", .len = 4 },
-               { .magic = "shsq", .len = 4 }, /* swap */
+               { .magic = "hsqs", .len = 4 },
                { NULL }
        }
 };
 
+const struct blkid_idinfo squashfs3_idinfo =
+{
+       .name           = "squashfs3",
+       .usage          = BLKID_USAGE_FILESYSTEM,
+       .probefunc      = probe_squashfs3,
+       .magics         =
+       {
+               { .magic = "sqsh", .len = 4 }, /* big endian */
+               { .magic = "hsqs", .len = 4 }, /* little endian */
+               { NULL }
+       }
+};
 
index 17da89a3e42b2d0c9c0e4039f794384e31a53d4f..91ca2ea2e5c96fcaa6d032b9306a5d60149224a8 100644 (file)
@@ -146,6 +146,7 @@ static const struct blkid_idinfo *idinfos[] =
        &oracleasm_idinfo,
        &vxfs_idinfo,
        &squashfs_idinfo,
+       &squashfs3_idinfo,
        &netware_idinfo,
        &btrfs_idinfo,
        &ubifs_idinfo,
index 2cae66a4184255b33a6eced023c21d1cfb6476cd..3bbfb9c1920407e879c7febb5b4e3f049ce80140 100644 (file)
@@ -57,6 +57,7 @@ extern const struct blkid_idinfo luks_idinfo;
 extern const struct blkid_idinfo highpoint37x_idinfo;
 extern const struct blkid_idinfo highpoint45x_idinfo;
 extern const struct blkid_idinfo squashfs_idinfo;
+extern const struct blkid_idinfo squashfs3_idinfo;
 extern const struct blkid_idinfo netware_idinfo;
 extern const struct blkid_idinfo sysv_idinfo;
 extern const struct blkid_idinfo xenix_idinfo;