[LTP] [PATCH] squashfs: Add regression test for sanity check bug
Joerg Vehlow
lkml@jv-coder.de
Tue Jul 13 15:32:36 CEST 2021
From: Joerg Vehlow <joerg.vehlow@aox-tech.de>
Adds a regression test for the fixes
c1b2028315 ("squashfs: fix inode lookup sanity checks …")
and
8b44ca2b62 ("squashfs: fix xattr id and id lookup sanity checks")
Signed-off-by: Joerg Vehlow <joerg.vehlow@aox-tech.de>
---
runtest/fs | 2 +
testcases/kernel/fs/squashfs/.gitignore | 1 +
testcases/kernel/fs/squashfs/Makefile | 11 +++
.../kernel/fs/squashfs/squashfs-createfiles.c | 84 +++++++++++++++++++
.../kernel/fs/squashfs/squashfs_regression.sh | 65 ++++++++++++++
5 files changed, 163 insertions(+)
create mode 100644 testcases/kernel/fs/squashfs/.gitignore
create mode 100644 testcases/kernel/fs/squashfs/Makefile
create mode 100644 testcases/kernel/fs/squashfs/squashfs-createfiles.c
create mode 100755 testcases/kernel/fs/squashfs/squashfs_regression.sh
diff --git a/runtest/fs b/runtest/fs
index 17b1415eb..a01eaf41d 100644
--- a/runtest/fs
+++ b/runtest/fs
@@ -85,3 +85,5 @@ fs_fill fs_fill
binfmt_misc01 binfmt_misc01.sh
binfmt_misc02 binfmt_misc02.sh
+
+squashfs_regression_sh squashfs_regression.sh
diff --git a/testcases/kernel/fs/squashfs/.gitignore b/testcases/kernel/fs/squashfs/.gitignore
new file mode 100644
index 000000000..ca1306b99
--- /dev/null
+++ b/testcases/kernel/fs/squashfs/.gitignore
@@ -0,0 +1 @@
+squashfs-createfiles
diff --git a/testcases/kernel/fs/squashfs/Makefile b/testcases/kernel/fs/squashfs/Makefile
new file mode 100644
index 000000000..f4e854fa2
--- /dev/null
+++ b/testcases/kernel/fs/squashfs/Makefile
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2009, Cisco Systems Inc.
+# Ngie Cooper, July 2009
+
+top_srcdir ?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+INSTALL_TARGETS := squashfs_regression.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/squashfs/squashfs-createfiles.c b/testcases/kernel/fs/squashfs/squashfs-createfiles.c
new file mode 100644
index 000000000..e7808041f
--- /dev/null
+++ b/testcases/kernel/fs/squashfs/squashfs-createfiles.c
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2021 Joerg Vehlow <joerg.vehlow@aox-tech.de>
+ *
+ * Simple c program for fast batch creation of dummy files,
+ * it can also set unique uid/gid combinations and xattr for
+ * all files creates. The same as shell code is extremely slower.
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/xattr.h>
+
+#define TST_NO_DEFAULT_MAIN
+#include "tst_test.h"
+#include "tst_safe_macros.h"
+
+void print_usage(const char *name)
+{
+ printf("Usage: %s [OPTION]\n\n", name);
+ printf("Creates n files in the current directory names 0,1,...\n\n");
+ printf(" -n n the number of files to create (default: 2048)\n");
+ printf(" -c set uid and groupid of file i to i:i\n");
+ printf(" -x set xattr security.x of file i to i\n");
+ printf(" -h this message\n");
+}
+
+int main(int argc, char** argv)
+{
+ int i;
+ int option;
+ int nfiles = 2048;
+ int set_owner = 0;
+ int set_xattr = 0;
+
+ while ((option = getopt(argc, argv, "n:cxh")) != -1) {
+ switch (option) {
+ case 'n':
+ if (tst_parse_int(optarg, &nfiles, 0, INT_MAX)) {
+ printf("Value for -n is invalid\n");
+ print_usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ break;
+ case 'c':
+ set_owner = 1;
+ break;
+ case 'x':
+ set_xattr = 1;
+ break;
+ case 'h':
+ print_usage(argv[0]);
+ return EXIT_SUCCESS;
+ default:
+ print_usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ }
+
+ for (i = 0; i < nfiles; ++i)
+ {
+ int fd;
+ char name[20];
+ sprintf(name, "%d", i);
+ fd = SAFE_OPEN(name, O_CREAT | O_EXCL, 0666);
+ if (set_owner)
+ SAFE_FCHOWN(fd, i, i);
+
+ /* This must be either security, user or trusted namespace.
+ * Nothing else can be stores in squashfs.
+ * Since the files are most likely created on a tmpfs,
+ * user is also not possible, because it is not allowed on tmpfs. */
+ if (set_xattr)
+ SAFE_FSETXATTR(fd, "security.x", &i, sizeof(i), XATTR_CREATE);
+ close(fd);
+ }
+
+ return 0;
+}
diff --git a/testcases/kernel/fs/squashfs/squashfs_regression.sh b/testcases/kernel/fs/squashfs/squashfs_regression.sh
new file mode 100755
index 000000000..8d3b8812c
--- /dev/null
+++ b/testcases/kernel/fs/squashfs/squashfs_regression.sh
@@ -0,0 +1,65 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2021 Joerg Vehlow <joerg.vehlow@aox-tech.de>
+#
+# This is a regression test for squashfs.
+# See test comment for details.
+
+TST_TESTFUNC=test
+TST_CLEANUP=cleanup
+TST_NEEDS_CMDS=mksquashfs
+TST_NEEDS_ROOT=1
+TST_NEEDS_TMPDIR=1
+
+. tst_test.sh
+
+cleanup()
+{
+ umount mnt >/dev/null 2>&1
+}
+
+
+# For inodes: 1023 (+1) entries
+# For ids: 2048
+# Fox xattr: 512
+
+test1()
+{
+ # Kernel commits
+ # - f37aa4c7366e23f91b81d00bafd6a7ab54e4a381
+ # - eabac19e40c095543def79cb6ffeb3a8588aaff4
+ # - 506220d2ba21791314af569211ffd8870b8208fa
+ # added some sanity checks, that verified the size of
+ # inode lookup, id (uid/gid) and xattr blocks in the squashfs,
+ # but roke mounting filesystems with completely filled blocks.
+ # A block has a max size of 8192.
+ # An inode lookup entry has an uncompressed size of 8 bytes,
+ # an id block 4 bytes and an xattr block 16 bytes.
+ #
+ # To fill up at least one block for each of the three tables,
+ # 2048 files with unique uid/gid and xattr are created.
+ #
+ # The bugs are fixed in kernel commits
+ # - c1b2028315c6b15e8d6725e0d5884b15887d3daa
+ # - 8b44ca2b634527151af07447a8090a5f3a043321
+
+ tst_res TINFO "Test squashfs sanity check regressions"
+
+ mkdir data
+ cd data
+ ROD squashfs-createfiles -cxn 2048
+ cd ..
+
+ # Create squashfs without any comporession.
+ # This allows reasoning about block sizes
+ mksquashfs data image.raw -noI -noD -noX -noF >/dev/null 2>&1
+ squashfs-info image.raw
+
+ mkdir mnt
+ EXPECT_PASS_BRK mount -o loop image.raw mnt
+ umount mnt
+
+ tst_res TPASS "Test passed"
+}
+
+tst_run
--
2.25.1
More information about the ltp
mailing list