Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp2147894iof; Tue, 7 Jun 2022 21:20:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwvGT+5LCPJNe+qY5NfkjDvsNRSFMjxBZvQcoFlkv8PEoUZQ4DS3iokOuuSZj1mI2P2o7CW X-Received: by 2002:a05:6a00:a10:b0:51b:fbe1:cedb with SMTP id p16-20020a056a000a1000b0051bfbe1cedbmr19341754pfh.68.1654662046382; Tue, 07 Jun 2022 21:20:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654662046; cv=none; d=google.com; s=arc-20160816; b=G0IpE6+UkCNKNfHlKfYpKmt5z6AK3hFtouDWlw97Mec+FW4W5ID6Znz9X2m7GUDliW +FnJAxgS804Ya8dhs/h0jvKtulSiSTXMAh4+35ESXmVTsp0kAH9rTHIqSPRgoqV4h9Z+ x9brsAvLVhKaZRqP5cEK3K5pw5fnehqvMyjwMhv7RyA7LZVEYf+hYFqqktlvAIiT37Ig BmHaPj6S+9HtJki4a+bzOeeBpzW02cebOZC1ZpnhP1RlHvFNsliPlfdT6b/2zYpCfUPN +cn53xcUq449di0WS21vuXZRWYFBFn+jN8kP5BHAGjKow0qd3oPko5rkOOvxFD9XtHFz Lb/A== 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=vfjOlh56Eix9Ars1m03LiyImEPneSn57fw/and9EkYU=; b=taO7l4Hvr2IpVQVk1npZ34C3k5d2RybERgG7vOvzwG8GYmwuE+HJjwjHhY6Yv94G1t 2aT1X8Q7xdqReR+SVHcaIqpIQ0N2AoWxxXlwIEEKD+S1aCciR3VzUji/nevvXia8lKoA 09HRNNZaYy8WUaTxe2W13+WqxcAoIncNhpE7NywZccV+li6/J5ehjS+4xT/lWXc4K6Cw t5lqC9q20LH+m7RhGkssw+Tg5iYzL+qr/Y8YF70C9IS6kltKdPmzbOqMogiuhYLwVB5k KsV1kbhsYw/UkFc10CH1eCNpWeSZuz3rHAXqeVNShPdlj7aOqVmImJxcTBTLZx2XA0PO VUog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=tCktFN2T; 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 c33-20020a634e21000000b003c6184913b4si26385839pgb.5.2022.06.07.21.20.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jun 2022 21:20:46 -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=tCktFN2T; 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 486C916FED6; Tue, 7 Jun 2022 20:51:56 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378785AbiFGVJh (ORCPT + 99 others); Tue, 7 Jun 2022 17:09:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60684 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1359460AbiFGULk (ORCPT ); Tue, 7 Jun 2022 16:11:40 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 70724632E; Tue, 7 Jun 2022 11:27:36 -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 ams.source.kernel.org (Postfix) with ESMTPS id 3F314B82380; Tue, 7 Jun 2022 18:27:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9B629C3411C; Tue, 7 Jun 2022 18:27:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1654626454; bh=2TsbinJLIFSqXHt2Xuqns8vJvrm0oHS2aRkp0nl59YM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tCktFN2TDYFGfVnXqXPv1sYY1YAxhYJK3a1ag2tdw2L4kbKHJBm1V/0nXZaqWjN76 piGV5keNgGAZtZbpsIxLSuzhH340GTq/XRMYYjHeJGnwv2Sijq/kL7mr/V4R8sK5g3 I3pE9cnsukFk08ZcNnnb9IbhgCSae+TdKeMp3LVw= 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.17 343/772] media: uvcvideo: Fix missing check to determine if element is found in list Date: Tue, 7 Jun 2022 18:58:55 +0200 Message-Id: <20220607164959.130264779@linuxfoundation.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220607164948.980838585@linuxfoundation.org> References: <20220607164948.980838585@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 711556d13d03..177181985345 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -871,29 +871,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