Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp410708pxk; Sun, 30 Aug 2020 08:09:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxTK44nwuwhwkhgXX85jBi1s2QvaETd66nLjgZC1DXjbTwNDBecCrnHSAKWKMLdXbjzzIbG X-Received: by 2002:aa7:d6d6:: with SMTP id x22mr8028450edr.282.1598800194559; Sun, 30 Aug 2020 08:09:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1598800194; cv=none; d=google.com; s=arc-20160816; b=M7tHQ9uJrYNGY1DcFN6CqUiJzFMO4zyaDzJVtUK3oiFnhGCvg6qZAYVECvDeRrtBYy oM4mhB6Lclic2F1Fy7RZPNIceG9N1f2M/5Lh0efWNhgsKfMWkWCj0VNEOLhgXGDObbHI sKtBH/RB6NRy5AuDizGqzuuhwRXHXHlfNwmfzsMn/vH07KcFV4jOVmM6qLAmSHsCrRmE 4nkzulmMB0UiK60uM+asFaKHM66zVYxA/dlBbWxEjmzlimA10pydqDK37ep8PHGr8Zg5 z8n5SB1hh0+EWkyK1B7DSscwbJ+CMcA/5Hbc5DhStiuOpKNKzooNs/0fZqqso/C3dFP4 ugvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=Es4kZEIMvRU2zV/gMiYhHOsFVc+QsyIoOtUdccLtNdo=; b=uAf8Nz1fOBx9yUixtyTQO9l7pjcJNmmQ7cHy/sIssYBvad+hzTEVQb8DF+Dg9d8V22 NvAngoE4K2RjGeRRsPU9Z1Sz6MoGLN3CsiqKnMziBlhk3JUx1pWifSd+urMRFyLyDa2u +2U/JdxiSDCdTHCWKRzniA+Pw4Skt6z3LodjbW1HU6ZBxMYXjBYffW5lRI9hu9PS3Rgf stziHdv+rpBHcR8daWv2F5Rebe3QAu3yX41lVJ4v0OXSx9SiIb/AuZqRxGi3AWfXBqfi 7EqhYsGsidkqrBZmnczC/XLnf4JhotabngbD60UQ1yQTpsfQr9CTCogX797gkkUiAC4J riRQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=MEaZJ54k; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u5si3830445ejn.410.2020.08.30.08.09.32; Sun, 30 Aug 2020 08:09:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=MEaZJ54k; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727883AbgH3PGJ (ORCPT + 99 others); Sun, 30 Aug 2020 11:06:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726454AbgH3PE4 (ORCPT ); Sun, 30 Aug 2020 11:04:56 -0400 Received: from mail-ot1-x343.google.com (mail-ot1-x343.google.com [IPv6:2607:f8b0:4864:20::343]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7CB05C061239; Sun, 30 Aug 2020 08:04:56 -0700 (PDT) Received: by mail-ot1-x343.google.com with SMTP id t7so3297445otp.0; Sun, 30 Aug 2020 08:04:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Es4kZEIMvRU2zV/gMiYhHOsFVc+QsyIoOtUdccLtNdo=; b=MEaZJ54kn8cL89PvsI0AHlm+W5xJuRyQGLHXQJBrL4I3fuaJXmCbyZ6nZhjAW/rVVl ioztRcHskqevxCjpaGAy3vwF1LnJUUzrRJJGpWzAWW3w/eTle3LELOI8LrqBdzGPKHXo Z3oxCGg05PS088Jdi3J0thU5UPNJTPYI9LPOw41SgdwRZDtz5utlHAbcjF9NCX/cLJMU VZzdmibml4IJSpqRye+BN/PwYXl0q1Eut8+eeLC8IqB1DvW7VH72pF56b0hOP5WnKVMn TgrojcB2EPTt4s3uON8pytz3MsQu1SYqihc0dZKGjc4PnRP33oaqMJX//MoHX1bDAvHp gVXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Es4kZEIMvRU2zV/gMiYhHOsFVc+QsyIoOtUdccLtNdo=; b=uX8nDeostAwKPdeRVgG7qUDiz58l8sx7ctkXd4XgG83igEvyXnEkIFGyxFNj0hNRIJ RFAa04+ftcZ48+n7OwPHZlerS5jVp4fQPZnJTzpnt6GpnjHOjY/8oFirKn1+ICozyduL gr+wrHyOyEiJ3uWTvwER7j2cJVAV6BSwPvhIxw16D+jWyQxYpiU2jAEqVcNI9njikpJ5 XTV3hjcD8BSEmEPE8QwbKM+cQz4NxVkapcW2cctGFiIZlW+toJR+5OGja5uj5u/qMSas UZi0HXuniCpMjvLX0HAnzl7IhbDhe4V1H0mh1UH2suTSCv7+fNtp/7ruLr4/7++uIZhE 5geg== X-Gm-Message-State: AOAM530AUhe+uRkBzwI7SgwUDYJc060C51P9/OYA/wHJva+FQ3owGoRS jXTn5Rm98HA/JMAfm5jVFfU= X-Received: by 2002:a9d:5e0c:: with SMTP id d12mr4761399oti.239.1598799895933; Sun, 30 Aug 2020 08:04:55 -0700 (PDT) Received: from localhost ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id c15sm1101354oiy.13.2020.08.30.08.04.55 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Sun, 30 Aug 2020 08:04:55 -0700 (PDT) From: Guenter Roeck To: Laurent Pinchart Cc: Mauro Carvalho Chehab , Sakari Ailus , linux-uvc-devel@lists.sourceforge.net, linux-usb@vger.kernel.org, linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Guenter Roeck , Alan Stern , Hans Verkuil Subject: [PATCH 5/5] media: uvcvideo: In uvc_v4l2_open, check if video device is registered Date: Sun, 30 Aug 2020 08:04:43 -0700 Message-Id: <20200830150443.167286-6-linux@roeck-us.net> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200830150443.167286-1-linux@roeck-us.net> References: <20200830150443.167286-1-linux@roeck-us.net> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org uvc_v4l2_open() acquires the uvc device mutex. After doing so, it does not check if the video device is still registered. This may result in race conditions and can result in an attempt to submit an urb to a disconnected USB interface (from uvc_v4l2_open). The problem was observed after adding a call to msleep() just before acquiring the mutex and disconnecting the camera during the sleep. Check if the video device is still registered after acquiring the mutex to avoid the problem. In the release function, only call uvc_status_stop() if the video device is still registered. If the video device has been unregistered, the urb associated with uvc status has already been killed in uvc_status_unregister(). Trying to kill it again won't do any good and might have unexpected side effects. Cc: Laurent Pinchart Cc: Alan Stern Cc: Hans Verkuil Signed-off-by: Guenter Roeck --- drivers/media/usb/uvc/uvc_v4l2.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 7e5e583dae5e..1f7d454557b9 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -548,6 +548,10 @@ static int uvc_v4l2_open(struct file *file) } mutex_lock(&stream->dev->lock); + if (!video_is_registered(&stream->vdev)) { + mutex_unlock(&stream->dev->lock); + return -ENODEV; + } if (stream->dev->users == 0) { ret = uvc_status_start(stream->dev, GFP_KERNEL); if (ret < 0) { @@ -590,7 +594,7 @@ static int uvc_v4l2_release(struct file *file) file->private_data = NULL; mutex_lock(&stream->dev->lock); - if (--stream->dev->users == 0) + if (--stream->dev->users == 0 && video_is_registered(&stream->vdev)) uvc_status_stop(stream->dev); mutex_unlock(&stream->dev->lock); -- 2.17.1