lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 27 Nov 2013 11:40:39 +0100
From:	Aurelien Jarno <aurelien@...el32.net>
To:	linux-kernel@...r.kernel.org
Cc:	Aurelien Jarno <aurelien@...el32.net>,
	Alexander Viro <viro@...iv.linux.org.uk>,
	Christoph Hellwig <hch@...radead.org>,
	Theodore Ts'o <tytso@....edu>, linux-fsdevel@...r.kernel.org
Subject: [PATCH] UAPI linux/fs.h: add a warning about wrong ioctl argument types

The FS_IOC_GETFLAGS, FS_IOC_SETFLAGS, FS_IOC_GETVERSION and
FS_IOC_SETVERSION ioctls are declared for historical reasons with a long
argument, while in practice they take an int argument. This is
unfortunately not possible to fix that without breaking the kernel ABI.

However good programmers actually lookup for the argument type of these
ioctls in <fs/linux.h> and end-up using a long. This breaks on 64-bit
big endian machines.

Instead of letting the same "mistake" to be done again and again, add an
explanation to <fs/linux.h> so that people use the correct argument type
in their code. Also add a small comment on the same line while staying
within 80 characters so that the issue appears when doing a grep on this
file.

Cc: Alexander Viro <viro@...iv.linux.org.uk>
Cc: Christoph Hellwig <hch@...radead.org>
Cc: Theodore Ts'o <tytso@....edu>
Cc: linux-fsdevel@...r.kernel.org
Signed-off-by: Aurelien Jarno <aurelien@...el32.net>
---
 include/uapi/linux/fs.h | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
index 6c28b61..baeb803 100644
--- a/include/uapi/linux/fs.h
+++ b/include/uapi/linux/fs.h
@@ -154,10 +154,16 @@ struct inodes_stat_t {
 #define FITHAW		_IOWR('X', 120, int)	/* Thaw */
 #define FITRIM		_IOWR('X', 121, struct fstrim_range)	/* Trim */
 
-#define	FS_IOC_GETFLAGS			_IOR('f', 1, long)
-#define	FS_IOC_SETFLAGS			_IOW('f', 2, long)
-#define	FS_IOC_GETVERSION		_IOR('v', 1, long)
-#define	FS_IOC_SETVERSION		_IOW('v', 2, long)
+/*
+ * WARNING: The next four following ioctls actually take an int argument
+ * despite their definition. This is important to support 64-bit big-endian
+ * machines.
+ */
+#define	FS_IOC_GETFLAGS			_IOR('f', 1, long) /* should be int */
+#define	FS_IOC_SETFLAGS			_IOW('f', 2, long) /* should be int */
+#define	FS_IOC_GETVERSION		_IOR('v', 1, long) /* should be int */
+#define	FS_IOC_SETVERSION		_IOW('v', 2, long) /* should be int */
+
 #define FS_IOC_FIEMAP			_IOWR('f', 11, struct fiemap)
 #define FS_IOC32_GETFLAGS		_IOR('f', 1, int)
 #define FS_IOC32_SETFLAGS		_IOW('f', 2, int)
-- 
1.8.4.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ