From: Alan Stern <stern@rowland.harvard.edu>
To: Johan Hovold <johan@kernel.org>
Cc: Greg KH <greg@kroah.com>, "Geoffrey D. Bennett" <g@b4.vu>,
USB mailing list <linux-usb@vger.kernel.org>
Subject: Re: [PATCH v2] USB: core: WARN if pipe direction != setup packet direction
Date: Tue, 25 May 2021 11:12:08 -0400 [thread overview]
Message-ID: <20210525151208.GA1363494@rowland.harvard.edu> (raw)
In-Reply-To: <YKzwMVxgaVycl+Yi@hovoldconsulting.com>
On Tue, May 25, 2021 at 02:40:17PM +0200, Johan Hovold wrote:
> On Mon, May 24, 2021 at 10:47:36AM -0400, Alan Stern wrote:
> > Do you think the check should be weakened for this case (i.e., ignore
> > the direction bit in bRequestType when wLength is 0)? So far it seems
> > that the number of places getting this wrong isn't prohibitively large.
>
> In a sense the request-type direction bit is already ignored when
> wLength is zero. The question is if we should ignore the direction bit
> of the pipe argument, or rather allow it to be IN, when wLength is
> zero.
>
> With the above check now merged, the following transfer triggers the
> warning:
>
> usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
> 0, USB_DIR_IN | USB_TYPE_VENDOR,
> 0x0020, CMD_I2C_DA_RD,
> NULL, 0, 1000);
>
> This request was used by a media driver to determine if a certain i2c
> register was accessible by attempting to read it without really caring
> about its value.
>
> I changed the above to actually read the value, but this is an example
> where allowing usb_rcvctrlpipe() might otherwise make sense was it not
> for the possibility that some HCD could get confused.
>
> Changing the above to use usb_sndctrlpipe() while either keeping
> USB_DIR_IN or dropping USB_DIR_IN (for an I2C read request) does not
> seem right. The latter could potentially even confuse some firmware even
> if the direction bit is supposed to be ignored.
>
> So far this is the only example I've found where changing to
> usb_sndctrlpipe() and USB_DIR_OUT isn't obviously correct, but on the
> other hand just reading the register in question is straight-forward
> enough and does not require any exceptions in usb_submit_urb().
Okay, yes. This seems like a sufficiently unusual edge case that we
don't need to add special code to cater for it.
In fact, the direction bit in the pipe for a control transfer is never
exposed to the USB device. All the device sees is bRequestType and the
data/status packet tokens (IN or OUT), which are dictated by the USB
protocol. So the fact that we insist on usb_sndctrlpipe for what will
ultimately become an I2C read request is unimportant.
> We could perhaps even go the other way and strengthen the check to warn
> if USB_DIR_IN is set when wLength is zero...
Given that the spec says the direction bit is ignored when wLength is
zero, I think we shouldn't do this.
> > PS: Another check we could add is to make sure that the
> > transfer_buffer_length value agrees with wLength. Should I add such a
> > check?
>
> That sounds sensible as some of the HCDs only appears to check
> transfer_buffer_length when handling the data stage and a mismatch could
> amount to undefined behaviour (OUT) or perhaps even buffer overruns
> (IN).
>
> Judging from a quick check we don't seem to have any such cases
> currently so this could be implemented as a submission failure rather
> than another warning.
All right; I'll make the submission fail with a -EBADR (invalid request
descriptor) error; that seems like a good choice of an obscure and
otherwise unused value to match this case. But I'll put in a debugging
message, so that anyone who wants to know if this is occurring will have
a way to find out.
Alan Stern
next prev parent reply other threads:[~2021-05-25 15:12 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-20 20:20 [PATCH] USB: core: WARN if pipe direction != setup packet direction Alan Stern
2021-05-21 8:03 ` Johan Hovold
2021-05-21 12:14 ` Greg KH
2021-05-21 13:17 ` Johan Hovold
2021-05-21 14:41 ` Alan Stern
2021-05-22 2:16 ` [PATCH v2] " Alan Stern
2021-05-22 7:56 ` Johan Hovold
2021-05-24 11:39 ` Johan Hovold
2021-05-24 14:47 ` Alan Stern
2021-05-25 12:40 ` Johan Hovold
2021-05-25 15:12 ` Alan Stern [this message]
2021-05-26 7:49 ` Johan Hovold
2021-05-21 14:38 ` [PATCH] " Alan Stern
2021-05-22 7:56 ` Johan Hovold
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=20210525151208.GA1363494@rowland.harvard.edu \
--to=stern@rowland.harvard.edu \
--cc=g@b4.vu \
--cc=greg@kroah.com \
--cc=johan@kernel.org \
--cc=linux-usb@vger.kernel.org \
/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