From: Christoph Hellwig <hch@infradead.org>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Kashyap Desai <kashyap.desai@broadcom.com>,
Sumit Saxena <sumit.saxena@broadcom.com>,
Shivasharan S <shivasharan.srikanteshwara@broadcom.com>,
"James E.J. Bottomley" <jejb@linux.ibm.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
hch@infradead.org, Anand Lodnoor <anand.lodnoor@broadcom.com>,
Chandrakanth Patil <chandrakanth.patil@broadcom.com>,
Hannes Reinecke <hare@suse.de>,
megaraidlinux.pdl@broadcom.com, linux-scsi@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/3] scsi: megaraid_sas: simplify compat_ioctl handling
Date: Sat, 12 Sep 2020 08:47:57 +0100 [thread overview]
Message-ID: <20200912074757.GA6688@infradead.org> (raw)
In-Reply-To: <20200908213715.3553098-3-arnd@arndb.de>
On Tue, Sep 08, 2020 at 11:36:23PM +0200, Arnd Bergmann wrote:
> There have been several attempts to fix serious problems
> in the compat handling in megasas_mgmt_compat_ioctl_fw(),
> and it also uses the compat_alloc_user_space() function.
I just looked into this a few weeks ago but didn't get that far..
> +static struct megasas_iocpacket *megasas_compat_iocpacket_get_user(void __user *arg)
Pointlessly long line.
> +{
> + int err = -EFAULT;
> +#ifdef CONFIG_COMPAT
I find the ifdef inside the function a little weird. Doing it in the
caller would be a little less bad. What I ended up doing in my
unfinished patch was to move the compat handling into a new
megaraid_sas_compat.c file, so we'd always get the prototypes in a
header, but given that all the calls are eliminated for the !COMPAT
case we'd avoid ifdefs entirely, but having that file for a single
function is also rather silly.
> + struct megasas_iocpacket *ioc;
> + struct compat_megasas_iocpacket __user *cioc = arg;
> + int i;
> +
> + ioc = kzalloc(sizeof(*ioc), GFP_KERNEL);
Missing NULL check here.
> + if (copy_from_user(ioc, arg,
> + offsetof(struct megasas_iocpacket, frame) + 128))
> + goto out;
the 128 here while copied from the original code should probably be
replaced with a sizeof(frame->raw).
> + if (ioc->sense_len) {
> + compat_uptr_t *sense_ioc_ptr;
> + void __user *sense_cioc;
> +
> + /* make sure the pointer is inside of frame.raw */
> + if (ioc->sense_off >
> + (sizeof(ioc->frame.raw) - sizeof(void __user*))) {
> + err = -EINVAL;
> + goto out;
> + }
> +
> + sense_ioc_ptr = (compat_uptr_t *)&ioc->frame.raw[ioc->sense_off];
> + sense_cioc = compat_ptr(get_unaligned(sense_ioc_ptr));
> + put_unaligned((unsigned long)sense_cioc, (void **)sense_ioc_ptr);
I think we should really handle this where the sense point is set up.
This is the untested hunk I had:
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index 48fad675b5ed02..c3ddcfce86df50 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -8231,7 +8231,12 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
goto out;
}
- sense_ptr = (void *)cmd->frame + ioc->sense_off;
+ if (in_compat_syscall())
+ sense_ptr = compat_ptr((uintptr_t)cmd->frame) +
+ ioc->sense_off;
+ else
+ sense_ptr = (void *)cmd->frame + ioc->sense_off;
+
if (instance->consistent_mask_64bit)
put_unaligned_le64(sense_handle, sense_ptr);
else
The same might make sense for the iovecs, but I didn't get to that
yet..
> static long
> megasas_mgmt_compat_ioctl(struct file *file, unsigned int cmd,
> unsigned long arg)
> {
> switch (cmd) {
> case MEGASAS_IOC_FIRMWARE32:
> - return megasas_mgmt_compat_ioctl_fw(file, arg);
> + return megasas_mgmt_ioctl_fw(file, arg);
> case MEGASAS_IOC_GET_AEN:
> return megasas_mgmt_ioctl_aen(file, arg);
> }
We should be able to kill off megasas_mgmt_compat_ioctl entirely now.
next prev parent reply other threads:[~2020-09-12 7:48 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-08 21:36 [PATCH 1/3] scsi: aacraid: improve compat_ioctl handlers Arnd Bergmann
2020-09-08 21:36 ` [PATCH 2/3] scsi: megaraid_sas: check user-provided offsets Arnd Bergmann
2020-09-12 7:20 ` Christoph Hellwig
2020-09-12 17:03 ` Arnd Bergmann
2020-12-31 0:15 ` Phil Oester
2021-01-03 16:26 ` Arnd Bergmann
2021-01-03 17:00 ` James Bottomley
2021-01-03 18:49 ` Arnd Bergmann
2021-01-03 20:12 ` James Bottomley
2021-01-04 17:48 ` Phil Oester
2021-01-04 22:24 ` Arnd Bergmann
2020-09-08 21:36 ` [PATCH 3/3] scsi: megaraid_sas: simplify compat_ioctl handling Arnd Bergmann
2020-09-12 7:47 ` Christoph Hellwig [this message]
2020-09-12 12:49 ` Arnd Bergmann
2020-09-13 6:50 ` compat_alloc_user_space removal, was " Christoph Hellwig
2020-09-13 11:46 ` Arnd Bergmann
2020-09-17 14:55 ` Arnd Bergmann
2020-09-17 14:57 ` Christoph Hellwig
2020-09-12 7:09 ` [PATCH 1/3] scsi: aacraid: improve compat_ioctl handlers Christoph Hellwig
2020-09-17 15:02 ` Arnd Bergmann
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=20200912074757.GA6688@infradead.org \
--to=hch@infradead.org \
--cc=anand.lodnoor@broadcom.com \
--cc=arnd@arndb.de \
--cc=chandrakanth.patil@broadcom.com \
--cc=hare@suse.de \
--cc=jejb@linux.ibm.com \
--cc=kashyap.desai@broadcom.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=megaraidlinux.pdl@broadcom.com \
--cc=shivasharan.srikanteshwara@broadcom.com \
--cc=sumit.saxena@broadcom.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox