From: "Darrick J. Wong" <djwong@kernel.org>
To: Arnd Bergmann <arnd@kernel.org>
Cc: linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
Anuj Gupta <anuj20.g@samsung.com>,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Kanchan Joshi <joshi.k@samsung.com>,
ltp@lists.linux.it, dan.carpenter@linaro.org,
benjamin.copeland@linaro.org, rbm@suse.com,
Arnd Bergmann <arnd@arndb.de>,
Naresh Kamboju <naresh.kamboju@linaro.org>,
Anders Roxell <anders.roxell@linaro.org>,
Jens Axboe <axboe@kernel.dk>,
Pavel Begunkov <asml.silence@gmail.com>,
Christian Brauner <brauner@kernel.org>,
Alexey Dobriyan <adobriyan@gmail.com>,
Eric Biggers <ebiggers@google.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] block: fix FS_IOC_GETLBMD_CAP parsing in blkdev_common_ioctl()
Date: Wed, 9 Jul 2025 11:27:06 -0700 [thread overview]
Message-ID: <20250709182706.GF2672070@frogsfrogsfrogs> (raw)
In-Reply-To: <20250709181030.236190-1-arnd@kernel.org>
On Wed, Jul 09, 2025 at 08:10:14PM +0200, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
>
> Anders and Naresh found that the addition of the FS_IOC_GETLBMD_CAP
> handling in the blockdev ioctl handler breaks all ioctls with
> _IOC_NR==2, as the new command is not added to the switch but only
> a few of the command bits are check.
>
> Refine the check to also validate the direction/type/length bits,
> but still allow all supported sizes for future extensions.
>
> Move the new command to the end of the function to avoid slowing
> down normal ioctl commands with the added branches.
>
> Fixes: 9eb22f7fedfc ("fs: add ioctl to query metadata and protection info capabilities")
> Link: https://lore.kernel.org/all/CA+G9fYvk9HHE5UJ7cdJHTcY6P5JKnp+_e+sdC5U-ZQFTP9_hqQ@mail.gmail.com/
> Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org>
> Cc: Anders Roxell <anders.roxell@linaro.org>
> Cc: Naresh Kamboju <naresh.kamboju@linaro.org>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> It seems that we have a lot of drivers with the same bug, as the
> large majority of all _IOC_NR() users in the kernel fail to also
> check the other bits of the ioctl command code. There are currently
> 55 files referencing _IOC_NR, and they all need to be manually
> checked for this problem.
> ---
> block/ioctl.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/block/ioctl.c b/block/ioctl.c
> index 9ad403733e19..5e5a422bd09f 100644
> --- a/block/ioctl.c
> +++ b/block/ioctl.c
> @@ -567,9 +567,6 @@ static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode,
> {
> unsigned int max_sectors;
>
> - if (_IOC_NR(cmd) == _IOC_NR(FS_IOC_GETLBMD_CAP))
> - return blk_get_meta_cap(bdev, cmd, argp);
> -
> switch (cmd) {
> case BLKFLSBUF:
> return blkdev_flushbuf(bdev, cmd, arg);
> @@ -647,9 +644,16 @@ static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode,
> return blkdev_pr_preempt(bdev, mode, argp, true);
> case IOC_PR_CLEAR:
> return blkdev_pr_clear(bdev, mode, argp);
> - default:
> - return -ENOIOCTLCMD;
> }
> +
> + if (_IOC_DIR(cmd) == _IOC_DIR(FS_IOC_GETLBMD_CAP) &&
> + _IOC_TYPE(cmd) == _IOC_TYPE(FS_IOC_GETLBMD_CAP) &&
> + _IOC_NR(cmd) == _IOC_NR(FS_IOC_GETLBMD_CAP) &&
I think this problem was introduced by brauner trying to persuade people
to perform size independent dispatch of ioctls:
switch (_IOC_NR(cmd)) {
case _IOC_NR(FS_IOC_FSGETXATTR):
if (WARN_ON_ONCE(_IOC_TYPE(cmd) != _IOC_TYPE(FS_IOC_FSGETXATTR)))
return SOMETHING_SOMETHING;
/* Only handle original size. */
return ioctl_fsgetxattr(filp, argp);
https://lore.kernel.org/linux-xfs/20250515-bedarf-absagen-464773be3e72@brauner/
though we probably want a helper or something to encapsulate those three
comparisons to avoid the SOMETHING_SOMETHING part:
#define IOC_DISPATCH(c) \
((c) & ~(_IOC(0, 0, 0, _IOC_SIZE(_IOC_SIZEMASK))))
switch (IOC_DISPATCH(cmd)) {
case IOC_DISPATCH(FS_IOC_FSGETXATTR):
return ioctl_fsgetxattr(filp, cmd, argp);
Assuming that ioctl_fsgetxattr derives size from @cmd and rejects values
that it doesn't like. Hrm?
> + _IOC_SIZE(cmd) >= LBMD_SIZE_VER0 &&
> + _IOC_SIZE(cmd) <= _IOC_SIZE(FS_IOC_GETLBMD_CAP))
blk_get_meta_cap already checks this.
--D
> + return blk_get_meta_cap(bdev, cmd, argp);
> +
> + return -ENOIOCTLCMD;
> }
>
> /*
> --
> 2.39.5
>
WARNING: multiple messages have this Message-ID (diff)
From: "Darrick J. Wong via ltp" <ltp@lists.linux.it>
To: Arnd Bergmann <arnd@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>,
Christian Brauner <brauner@kernel.org>,
"Martin K . Petersen" <martin.petersen@oracle.com>,
Kanchan Joshi <joshi.k@samsung.com>,
Eric Biggers <ebiggers@google.com>,
Anuj Gupta <anuj20.g@samsung.com>,
linux-kernel@vger.kernel.org,
Pavel Begunkov <asml.silence@gmail.com>,
linux-block@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>,
dan.carpenter@linaro.org, rbm@suse.com,
linux-fsdevel@vger.kernel.org, benjamin.copeland@linaro.org,
ltp@lists.linux.it, Alexey Dobriyan <adobriyan@gmail.com>
Subject: Re: [LTP] [PATCH] block: fix FS_IOC_GETLBMD_CAP parsing in blkdev_common_ioctl()
Date: Wed, 9 Jul 2025 11:27:06 -0700 [thread overview]
Message-ID: <20250709182706.GF2672070@frogsfrogsfrogs> (raw)
In-Reply-To: <20250709181030.236190-1-arnd@kernel.org>
On Wed, Jul 09, 2025 at 08:10:14PM +0200, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
>
> Anders and Naresh found that the addition of the FS_IOC_GETLBMD_CAP
> handling in the blockdev ioctl handler breaks all ioctls with
> _IOC_NR==2, as the new command is not added to the switch but only
> a few of the command bits are check.
>
> Refine the check to also validate the direction/type/length bits,
> but still allow all supported sizes for future extensions.
>
> Move the new command to the end of the function to avoid slowing
> down normal ioctl commands with the added branches.
>
> Fixes: 9eb22f7fedfc ("fs: add ioctl to query metadata and protection info capabilities")
> Link: https://lore.kernel.org/all/CA+G9fYvk9HHE5UJ7cdJHTcY6P5JKnp+_e+sdC5U-ZQFTP9_hqQ@mail.gmail.com/
> Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org>
> Cc: Anders Roxell <anders.roxell@linaro.org>
> Cc: Naresh Kamboju <naresh.kamboju@linaro.org>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> It seems that we have a lot of drivers with the same bug, as the
> large majority of all _IOC_NR() users in the kernel fail to also
> check the other bits of the ioctl command code. There are currently
> 55 files referencing _IOC_NR, and they all need to be manually
> checked for this problem.
> ---
> block/ioctl.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/block/ioctl.c b/block/ioctl.c
> index 9ad403733e19..5e5a422bd09f 100644
> --- a/block/ioctl.c
> +++ b/block/ioctl.c
> @@ -567,9 +567,6 @@ static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode,
> {
> unsigned int max_sectors;
>
> - if (_IOC_NR(cmd) == _IOC_NR(FS_IOC_GETLBMD_CAP))
> - return blk_get_meta_cap(bdev, cmd, argp);
> -
> switch (cmd) {
> case BLKFLSBUF:
> return blkdev_flushbuf(bdev, cmd, arg);
> @@ -647,9 +644,16 @@ static int blkdev_common_ioctl(struct block_device *bdev, blk_mode_t mode,
> return blkdev_pr_preempt(bdev, mode, argp, true);
> case IOC_PR_CLEAR:
> return blkdev_pr_clear(bdev, mode, argp);
> - default:
> - return -ENOIOCTLCMD;
> }
> +
> + if (_IOC_DIR(cmd) == _IOC_DIR(FS_IOC_GETLBMD_CAP) &&
> + _IOC_TYPE(cmd) == _IOC_TYPE(FS_IOC_GETLBMD_CAP) &&
> + _IOC_NR(cmd) == _IOC_NR(FS_IOC_GETLBMD_CAP) &&
I think this problem was introduced by brauner trying to persuade people
to perform size independent dispatch of ioctls:
switch (_IOC_NR(cmd)) {
case _IOC_NR(FS_IOC_FSGETXATTR):
if (WARN_ON_ONCE(_IOC_TYPE(cmd) != _IOC_TYPE(FS_IOC_FSGETXATTR)))
return SOMETHING_SOMETHING;
/* Only handle original size. */
return ioctl_fsgetxattr(filp, argp);
https://lore.kernel.org/linux-xfs/20250515-bedarf-absagen-464773be3e72@brauner/
though we probably want a helper or something to encapsulate those three
comparisons to avoid the SOMETHING_SOMETHING part:
#define IOC_DISPATCH(c) \
((c) & ~(_IOC(0, 0, 0, _IOC_SIZE(_IOC_SIZEMASK))))
switch (IOC_DISPATCH(cmd)) {
case IOC_DISPATCH(FS_IOC_FSGETXATTR):
return ioctl_fsgetxattr(filp, cmd, argp);
Assuming that ioctl_fsgetxattr derives size from @cmd and rejects values
that it doesn't like. Hrm?
> + _IOC_SIZE(cmd) >= LBMD_SIZE_VER0 &&
> + _IOC_SIZE(cmd) <= _IOC_SIZE(FS_IOC_GETLBMD_CAP))
blk_get_meta_cap already checks this.
--D
> + return blk_get_meta_cap(bdev, cmd, argp);
> +
> + return -ENOIOCTLCMD;
> }
>
> /*
> --
> 2.39.5
>
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2025-07-09 18:27 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-09 18:10 [PATCH] block: fix FS_IOC_GETLBMD_CAP parsing in blkdev_common_ioctl() Arnd Bergmann
2025-07-09 18:10 ` [LTP] " Arnd Bergmann via ltp
2025-07-09 18:27 ` Darrick J. Wong [this message]
2025-07-09 18:27 ` Darrick J. Wong via ltp
2025-07-09 20:30 ` Arnd Bergmann
2025-07-09 20:30 ` [LTP] " Arnd Bergmann
2025-07-10 8:00 ` Christian Brauner
2025-07-10 8:00 ` [LTP] " Christian Brauner via ltp
2025-07-10 8:14 ` Christoph Hellwig
2025-07-10 8:14 ` [LTP] " Christoph Hellwig
2025-07-10 10:50 ` Arnd Bergmann
2025-07-10 10:50 ` [LTP] " Arnd Bergmann
2025-07-10 10:59 ` Christoph Hellwig
2025-07-10 10:59 ` [LTP] " Christoph Hellwig
2025-07-10 11:52 ` Arnd Bergmann
2025-07-10 11:52 ` [LTP] " Arnd Bergmann
2025-07-10 12:11 ` Christian Brauner
2025-07-10 12:11 ` [LTP] " Christian Brauner via ltp
2025-07-10 10:11 ` Arnd Bergmann
2025-07-10 10:11 ` [LTP] " Arnd Bergmann
2025-07-10 12:03 ` Christian Brauner
2025-07-10 12:03 ` [LTP] " Christian Brauner via ltp
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250709182706.GF2672070@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=adobriyan@gmail.com \
--cc=anders.roxell@linaro.org \
--cc=anuj20.g@samsung.com \
--cc=arnd@arndb.de \
--cc=arnd@kernel.org \
--cc=asml.silence@gmail.com \
--cc=axboe@kernel.dk \
--cc=benjamin.copeland@linaro.org \
--cc=brauner@kernel.org \
--cc=dan.carpenter@linaro.org \
--cc=ebiggers@google.com \
--cc=joshi.k@samsung.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ltp@lists.linux.it \
--cc=martin.petersen@oracle.com \
--cc=naresh.kamboju@linaro.org \
--cc=rbm@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.