Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3001591imu; Sun, 9 Dec 2018 14:48:04 -0800 (PST) X-Google-Smtp-Source: AFSGD/XOg4DDY9D63m7yvm4I7aDIC3a5tXdjPx4XfPc8ciDudCQ2ZMcDxa9mrf2HByC1zWYwys+h X-Received: by 2002:a63:1a4b:: with SMTP id a11mr8941566pgm.254.1544395684207; Sun, 09 Dec 2018 14:48:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544395684; cv=none; d=google.com; s=arc-20160816; b=gmsXbF/m0FPCB7npqYzxTWC+lreztYLecvrZMzGpe7FmAWlcpjyqGmBtSnNrjZPVew lqyt8rrAW/zojy7k5dC2Hy3MOE4wBzvhtIbsx+8MiAlP5AEzuYbWXokJxWoKVHBSseRq zIJwJs/njJxzil06vQRBZX/yyZXDimFcWJx2/qFhq70puwjoh8XY4PrwNBEYk4ZbXPzM z5lIMfcS3Deqa8EpfJRtl88orO1WGDxl00yDNVGPLpQlD33xSS+wzXcIWT3Qa4e7iBoY QdxV72vC0CG2On/plUfLq4eoyAcmh8OVBdP+gxAEHao6WxMrWTTjC5hKFFW4WiTkx1Pu Rh4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=HLpgPsX9lDWCb0UcFl5p8bzS4D+CPpFS+bAwDVLPMn8=; b=xb2u1U6FpgW0flBrV8lSAsZ81sa2ieP1MTFTvI5LUNJl0Dz5qfRdYVjTP5sxPXe0Wj fHBUWvdEepDuB9Ho8OnYy6YfTURpNeanijeTn4l6viO6+nsGh3VaAZWVfBoj0v3zj8p9 bHtXaAAxWgrrvBSApWIj+il2T2WPu4/gY4ES5RaO2T0l8qQ1GiiC0s+3FabH1nAUNQRG blibFhaKWDRtUU1B3c+Bn9Fo/FlhphiwZHxPFWCwtF7QH1v7cgxdN9plrmya2w2sOXi/ Vgtqr9bb3vyK67VHcdlBNxnislBBtUsNiVbvf74BXjZOtsTqGdoR2Fyf6WKUT7geYQP1 eCVw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e1si9098279pln.55.2018.12.09.14.47.48; Sun, 09 Dec 2018 14:48:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726805AbeLIV7v (ORCPT + 99 others); Sun, 9 Dec 2018 16:59:51 -0500 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:36166 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726731AbeLIVzi (ORCPT ); Sun, 9 Dec 2018 16:55:38 -0500 Received: from pub.yeoldevic.com ([81.174.156.145] helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gW72z-0002pr-RA; Sun, 09 Dec 2018 21:55:34 +0000 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1gW72i-0003aU-Ic; Sun, 09 Dec 2018 21:55:16 +0000 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, "Greg Kroah-Hartman" , "Oliver Neukum" , syzbot+843efa30c8821bd69f53@syzkaller.appspotmail.com Date: Sun, 09 Dec 2018 21:50:33 +0000 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 251/328] USB: usbdevfs: sanitize flags more In-Reply-To: X-SA-Exim-Connect-IP: 81.174.156.145 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.62-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Oliver Neukum commit 7a68d9fb851012829c29e770621905529bd9490b upstream. Requesting a ZERO_PACKET or not is sensible only for output. In the input direction the device decides. Likewise accepting short packets makes sense only for input. This allows operation with panic_on_warn without opening up a local DOS. Signed-off-by: Oliver Neukum Reported-by: syzbot+843efa30c8821bd69f53@syzkaller.appspotmail.com Fixes: 0cb54a3e47cb ("USB: debugging code shouldn't alter control flow") Signed-off-by: Greg Kroah-Hartman [bwh: Backported to 3.16: adjust context] Signed-off-by: Ben Hutchings --- drivers/usb/core/devio.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -1291,10 +1291,13 @@ static int proc_do_submiturb(struct usb_ struct async *as = NULL; struct usb_ctrlrequest *dr = NULL; unsigned int u, totlen, isofrmlen; - int i, ret, is_in, num_sgs = 0, ifnum = -1; + int i, ret, num_sgs = 0, ifnum = -1; int number_of_packets = 0; unsigned int stream_id = 0; void *buf; + bool is_in; + bool allow_short = false; + bool allow_zero = false; unsigned long mask = USBDEVFS_URB_SHORT_NOT_OK | USBDEVFS_URB_BULK_CONTINUATION | USBDEVFS_URB_NO_FSBR | @@ -1326,6 +1329,8 @@ static int proc_do_submiturb(struct usb_ u = 0; switch(uurb->type) { case USBDEVFS_URB_TYPE_CONTROL: + if (is_in) + allow_short = true; if (!usb_endpoint_xfer_control(&ep->desc)) return -EINVAL; /* min 8 byte setup packet */ @@ -1366,6 +1371,10 @@ static int proc_do_submiturb(struct usb_ break; case USBDEVFS_URB_TYPE_BULK: + if (!is_in) + allow_zero = true; + else + allow_short = true; switch (usb_endpoint_type(&ep->desc)) { case USB_ENDPOINT_XFER_CONTROL: case USB_ENDPOINT_XFER_ISOC: @@ -1386,6 +1395,10 @@ static int proc_do_submiturb(struct usb_ if (!usb_endpoint_xfer_int(&ep->desc)) return -EINVAL; interrupt_urb: + if (!is_in) + allow_zero = true; + else + allow_short = true; break; case USBDEVFS_URB_TYPE_ISO: @@ -1515,11 +1528,11 @@ static int proc_do_submiturb(struct usb_ u = (is_in ? URB_DIR_IN : URB_DIR_OUT); if (uurb->flags & USBDEVFS_URB_ISO_ASAP) u |= URB_ISO_ASAP; - if (uurb->flags & USBDEVFS_URB_SHORT_NOT_OK && is_in) + if (allow_short && uurb->flags & USBDEVFS_URB_SHORT_NOT_OK) u |= URB_SHORT_NOT_OK; if (uurb->flags & USBDEVFS_URB_NO_FSBR) u |= URB_NO_FSBR; - if (uurb->flags & USBDEVFS_URB_ZERO_PACKET) + if (allow_zero && uurb->flags & USBDEVFS_URB_ZERO_PACKET) u |= URB_ZERO_PACKET; if (uurb->flags & USBDEVFS_URB_NO_INTERRUPT) u |= URB_NO_INTERRUPT;