[PATCH] file_ioctl: decode FS_IOC{32,}_{G,S}ETFLAGS ioctls

Pierre Marsais pierre.marsais at lse.epita.fr
Mon Sep 2 22:35:50 UTC 2019


* xlat/inode_flags.in: New file.
* file_ioctl.c: Include "xlat/inode_flags.h".
(file_ioctl): Add decoding of FS_IOC_GETFLAGS, FS_IOC32_GETFLAGS,
FS_IOC_SETFLAGS, and FS_IOC32_SETFLAGS.
* tests/file_ioctl_inode_flags.c: New file.
* tests/gen_tests.in (file_ioctl_inode_flags): New entry.
* tests/pure_executables.list: Add file_ioctl_inode_flags.
* tests/.gitignore: Likewise.

Signed-off-by: Pierre Marsais <pierre.marsais at lse.epita.fr>
---
Hi strace developers,

Here is a simple patch decoding inode flags ioctls, as used by lsattr(1)
and chattr(1), documented in ioctl_iflags(2).

I gathered all flags from linux source tree include/uapi/linux/fs.h to
xlat/inode_flags.in, even though some of them should never be seen in
userspace.

 file_ioctl.c                   | 19 ++++++++++++++
 tests/.gitignore               |  1 +
 tests/file_ioctl_inode_flags.c | 45 ++++++++++++++++++++++++++++++++++
 tests/gen_tests.in             |  1 +
 tests/pure_executables.list    |  1 +
 xlat/inode_flags.in            | 28 +++++++++++++++++++++
 6 files changed, 95 insertions(+)
 create mode 100644 tests/file_ioctl_inode_flags.c
 create mode 100644 xlat/inode_flags.in

diff --git a/file_ioctl.c b/file_ioctl.c
index 27ba4c82..f5601d23 100644
--- a/file_ioctl.c
+++ b/file_ioctl.c
@@ -10,6 +10,8 @@
 #include <linux/ioctl.h>
 #include <linux/fs.h>
 
+#include "xlat/inode_flags.h"
+
 #ifdef HAVE_LINUX_FIEMAP_H
 # include <linux/fiemap.h>
 # include "xlat/fiemap_flags.h"
@@ -175,6 +177,23 @@ file_ioctl(struct tcb *const tcp, const unsigned int code,
 		return 0;
 	}
 
+	case FS_IOC_GETFLAGS:
+	case FS_IOC32_GETFLAGS:
+		if (entering(tcp))
+			return 0;
+		ATTRIBUTE_FALLTHROUGH;
+	case FS_IOC_SETFLAGS:
+	case FS_IOC32_SETFLAGS: {
+		uint32_t flags;
+
+		tprints(", ");
+		if (umove_or_printaddr(tcp, arg, &flags))
+			break;
+
+		printflags(inode_flags, flags, "FS_???_FL");
+		break;
+	}
+
 #ifdef HAVE_LINUX_FIEMAP_H
 	case FS_IOC_FIEMAP: {
 		struct fiemap args;
diff --git a/tests/.gitignore b/tests/.gitignore
index 4c854db8..e3ac0bb0 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -85,6 +85,7 @@ fdatasync
 fflush
 file_handle
 file_ioctl
+file_ioctl_inode_flags
 filter-unavailable
 finit_module
 flock
diff --git a/tests/file_ioctl_inode_flags.c b/tests/file_ioctl_inode_flags.c
new file mode 100644
index 00000000..c2fc49fb
--- /dev/null
+++ b/tests/file_ioctl_inode_flags.c
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2019 The strace developers.
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+
+# include <stdio.h>
+# include <sys/ioctl.h>
+# include <linux/fs.h>
+# include "xlat.h"
+# include "xlat/inode_flags.h"
+
+int
+main(int argc, char *argv[])
+{
+	unsigned int *arg = tail_alloc(sizeof(unsigned int));
+	unsigned long long flags;
+
+	arg = 0;
+
+	printf("ioctl(-1, "
+# if SIZEOF_LONG == 4
+	       "FS_IOC32_GETFLAGS or "
+# endif
+	       "FS_IOC_GETFLAGS, %p", &arg);
+	ioctl(-1, FS_IOC_GETFLAGS, &arg);
+	printf(") = -1 EBADF (%m)\n");
+
+	printf("ioctl(-1, "
+# if SIZEOF_LONG == 4
+	       "FS_IOC32_SETFLAGS or "
+# endif
+	       "FS_IOC_SETFLAGS, ");
+	flags = arg;
+	printflags(inode_flags, flags, "FS_???_FL");
+	ioctl(-1, FS_IOC_SETFLAGS, &arg);
+	printf(") = -1 EBADF (%m)\n");
+
+	puts("+++ exited with 0 +++");
+
+	return 0;
+}
diff --git a/tests/gen_tests.in b/tests/gen_tests.in
index 13a46194..4329cc23 100644
--- a/tests/gen_tests.in
+++ b/tests/gen_tests.in
@@ -65,6 +65,7 @@ fcntl64	-a8
 fdatasync	-a14
 file_handle	-e trace=name_to_handle_at,open_by_handle_at
 file_ioctl	+ioctl.test
+file_ioctl_inode_flags	+ioctl.test
 finit_module	-a25
 flock	-a19
 fork-f	-a26 -qq -f -e signal=none -e trace=chdir
diff --git a/tests/pure_executables.list b/tests/pure_executables.list
index b565eb9c..02aa75f2 100755
--- a/tests/pure_executables.list
+++ b/tests/pure_executables.list
@@ -69,6 +69,7 @@ fdatasync
 fflush
 file_handle
 file_ioctl
+file_ioctl_inode_flags
 finit_module
 flock
 fsconfig
diff --git a/xlat/inode_flags.in b/xlat/inode_flags.in
new file mode 100644
index 00000000..c1ede511
--- /dev/null
+++ b/xlat/inode_flags.in
@@ -0,0 +1,28 @@
+FS_SECRM_FL		0x00000001
+FS_UNRM_FL		0x00000002
+FS_COMPR_FL		0x00000004
+FS_SYNC_FL		0x00000008
+FS_IMMUTABLE_FL		0x00000010
+FS_APPEND_FL		0x00000020
+FS_NODUMP_FL		0x00000040
+FS_NOATIME_FL		0x00000080
+
+FS_DIRTY_FL		0x00000100
+FS_COMPRBLK_FL		0x00000200
+FS_NOCOMP_FL		0x00000400
+
+FS_ENCRYPT_FL		0x00000800
+FS_BTREE_FL		0x00001000
+FS_INDEX_FL		0x00001000
+FS_IMAGIC_FL		0x00002000
+FS_JOURNAL_DATA_FL	0x00004000
+FS_NOTAIL_FL		0x00008000
+FS_DIRSYNC_FL		0x00010000
+FS_TOPDIR_FL		0x00020000
+FS_HUGE_FILE_FL		0x00040000
+FS_EXTENT_FL		0x00080000
+FS_EA_INODE_FL		0x00200000
+FS_EOFBLOCKS_FL		0x00400000
+FS_NOCOW_FL		0x00800000
+FS_INLINE_DATA_FL	0x10000000
+FS_PROJINHERIT_FL	0x20000000
-- 
2.23.0



More information about the Strace-devel mailing list