Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp2190196iof; Tue, 7 Jun 2022 22:40:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwnMk9iUmneMWEdgn8flAiQtDvZg5Ve2jaPRlxL3N5NvWYO7HgFi4a7AOajcOXyRfWd1B85 X-Received: by 2002:a63:2213:0:b0:3fe:7f8:c917 with SMTP id i19-20020a632213000000b003fe07f8c917mr5365684pgi.406.1654666816560; Tue, 07 Jun 2022 22:40:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654666816; cv=none; d=google.com; s=arc-20160816; b=P6+z1N6UWYLsy+y35rt98Cs0vtFDNYi645+8iK5o2xxCYNVfky3n1bxgVcKCclzZEY IGByhAoZnvMuCOyOz2A7eT4fFSZssGZmPXXgLu7WrRZqOiRWu6PWKa+iGHYEz4CGw/NZ fnCTC2SC/dB3YzuQ31PuGSiAOPTG36kWniZgscvme7NhaZVSXLYZROmTfHa75sCq2Vs2 NN0yr8qURA+BTXNoAWMUOyOnzYNUtBh20/XawSke4vSE17iFtjJxuI2lvVmwE6lR0mbg uLuKCkLmIKcpjm2B1Fhq1OfTd/Qvj2e3dc5eJWchhfU5CniRgj9E7xo7XBiJ2y7GWQPq QIhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=n94x5HXJzgRnnIUjZOllBdLwK3VfgSNxtGAsC+Pduvc=; b=PE4XThSazxtGaqcR1Y/7/o8AC1Ry9l3dNxOy+V8Sbe4sU3Vl0ISqct22TV11hW+WAK VT6k0iRKGSKXEQlQ4ntY3ZfVzwfJOqJ4grNUYSfyAY0cJFP6ZGIZoOwFwJHGTWotdDTW UloUrZgagCV5TCowo1PwxAp0x1pMMSU6BlcSibPufe87Zn9gN2G0y929m2kX5RXzAKmK c7twspB9ldzetdVp2/KLhvJLREV+0UezdcFadOegFE4biDZCtbZ8R/1VSyMgPKV+yB37 foQWG+oZuFImXXoR7xk3chfLaFa1k10tsaSCb8sqy7+NpXqUHBpL2wOXwIzrXbUzwfY5 yrKQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=AdeTSAbC; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id w4-20020a63a744000000b003fc7efc3f69si26491972pgo.426.2022.06.07.22.40.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jun 2022 22:40:16 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=AdeTSAbC; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 8CCE2496400; Tue, 7 Jun 2022 22:06:22 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347877AbiFGRkZ (ORCPT + 99 others); Tue, 7 Jun 2022 13:40:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43000 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347507AbiFGRat (ORCPT ); Tue, 7 Jun 2022 13:30:49 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [IPv6:2604:1380:40e1:4800::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BB067DED4; Tue, 7 Jun 2022 10:27:10 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id 33C22CE1D50; Tue, 7 Jun 2022 17:27:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2F4D0C385A5; Tue, 7 Jun 2022 17:27:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1654622827; bh=3XMuabIbSNy3Znx1Wv+p8gpx5wBUFbZwNa6Jpd5xOKc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AdeTSAbCSNkyxdyBR/8gIUjQO/kmtFZ2zDTJES0ukffcC36owMvWJkQ0IAtZ+LA99 twJFEgQHlVlEwQRSwcn6QwSBZztECYYCUmEJmzupQgkNoIuETHtR01ZdXIoKG7oeyr 6dS9ZqeGSdB5AXd4VuiThp2Chh7iKU9qAz8krAhM= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Xiaomeng Tong , Laurent Pinchart , Mauro Carvalho Chehab , Sasha Levin Subject: [PATCH 5.10 195/452] media: uvcvideo: Fix missing check to determine if element is found in list Date: Tue, 7 Jun 2022 19:00:52 +0200 Message-Id: <20220607164914.375219888@linuxfoundation.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220607164908.521895282@linuxfoundation.org> References: <20220607164908.521895282@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Xiaomeng Tong [ Upstream commit 261f33388c29f6f3c12a724e6d89172b7f6d5996 ] The list iterator will point to a bogus position containing HEAD if the list is empty or the element is not found in list. This case should be checked before any use of the iterator, otherwise it will lead to a invalid memory access. The missing check here is before "pin = iterm->id;", just add check here to fix the security bug. In addition, the list iterator value will *always* be set and non-NULL by list_for_each_entry(), so it is incorrect to assume that the iterator value will be NULL if the element is not found in list, considering the (mis)use here: "if (iterm == NULL". Use a new value 'it' as the list iterator, while use the old value 'iterm' as a dedicated pointer to point to the found element, which 1. can fix this bug, due to 'iterm' is NULL only if it's not found. 2. do not need to change all the uses of 'iterm' after the loop. 3. can also limit the scope of the list iterator 'it' *only inside* the traversal loop by simply declaring 'it' inside the loop in the future, as usage of the iterator outside of the list_for_each_entry is considered harmful. https://lkml.org/lkml/2022/2/17/1032 Fixes: d5e90b7a6cd1c ("[media] uvcvideo: Move to video_ioctl2") Signed-off-by: Xiaomeng Tong Signed-off-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Sasha Levin --- drivers/media/usb/uvc/uvc_v4l2.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 753b8a99e08f..b40a2b904ace 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -863,29 +863,31 @@ static int uvc_ioctl_enum_input(struct file *file, void *fh, struct uvc_video_chain *chain = handle->chain; const struct uvc_entity *selector = chain->selector; struct uvc_entity *iterm = NULL; + struct uvc_entity *it; u32 index = input->index; - int pin = 0; if (selector == NULL || (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { if (index != 0) return -EINVAL; - list_for_each_entry(iterm, &chain->entities, chain) { - if (UVC_ENTITY_IS_ITERM(iterm)) + list_for_each_entry(it, &chain->entities, chain) { + if (UVC_ENTITY_IS_ITERM(it)) { + iterm = it; break; + } } - pin = iterm->id; } else if (index < selector->bNrInPins) { - pin = selector->baSourceID[index]; - list_for_each_entry(iterm, &chain->entities, chain) { - if (!UVC_ENTITY_IS_ITERM(iterm)) + list_for_each_entry(it, &chain->entities, chain) { + if (!UVC_ENTITY_IS_ITERM(it)) continue; - if (iterm->id == pin) + if (it->id == selector->baSourceID[index]) { + iterm = it; break; + } } } - if (iterm == NULL || iterm->id != pin) + if (iterm == NULL) return -EINVAL; memset(input, 0, sizeof(*input)); -- 2.35.1