Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1977990pxb; Fri, 5 Mar 2021 04:37:35 -0800 (PST) X-Google-Smtp-Source: ABdhPJzLHNqkfRxOyVczFv7tsUv/sndNL8aVmREm+sEJKXdTx8erVmw5m7XFcMEId0lMlk+7+EgO X-Received: by 2002:a50:ee05:: with SMTP id g5mr8918832eds.164.1614947855276; Fri, 05 Mar 2021 04:37:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614947855; cv=none; d=google.com; s=arc-20160816; b=T5T75/pGss2biO0tQ/xVN+ixv4DP+QShWYMbrLppVoFLYuxTV9ikoMIUOV8ukaj/zZ 1OMMy3xYa8/45t+98AQOdm6IO3yjfqeBNytxXs/gwdPEP/EBOA8K15Ah0975+iRD2b6C pkLHsWjlTbhRDHWZ4JJg65/xOYnIsX7a/0ZXO2yZyh6ec1dNAXJB/Ii3ppvTAe5zMS8O Nq4Jww1wxKkVPJbpgc9gtqXMLh8AJrNY68CNU4sCMqW8OCc+TivclNz1lvUHTy27DOp1 eLHIpHxMqEzLSaTZ0GOzjlbTcmbTKZmkTI/JlAZVl9f4A0fKbNxD/hN1XXzCkz1wp0wI y06Q== 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=m1nbzqi31/0/oXgKH7L58jgO8hmEm6rawLxru0/7KME=; b=xsabTxV1Ly36YxCvQnFFUqh7Eoq75ZFAxniL+nztcJ0gidHhh7m5sGz/l8DOT1Hool jWXYbtCBLJ6gLFy8LeAnQBlE1Xkd6Lqk0rbSxV09WQdXZz5dMPd1/2LCHiyTqLRd0i64 Td1nJyMO1f3PaFfJMVlJvnG2KLeB/N4gkQUuoirwvDSX9RJ0sNNkGpW07tUJrsZhR022 toNqxjrdRjRQ/pcq/eYW5vcCcDQawUeMUt7r/Z34Rdk48+VJde4iPomdX2+q2L+yEu6W l09ciHXni/e9vGtyldNF4ZSW2MT7gWQzSIMMBgdZr+hlu/dFzWRcqZ0Vf5VsJLJdGrak Ufqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Yu8Cm7TQ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e6si1652074edz.98.2021.03.05.04.37.11; Fri, 05 Mar 2021 04:37:35 -0800 (PST) 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=pass header.i=@linuxfoundation.org header.s=korg header.b=Yu8Cm7TQ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232301AbhCEMgN (ORCPT + 99 others); Fri, 5 Mar 2021 07:36:13 -0500 Received: from mail.kernel.org ([198.145.29.99]:48306 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232533AbhCEMfo (ORCPT ); Fri, 5 Mar 2021 07:35:44 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 5FC316501C; Fri, 5 Mar 2021 12:35:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614947744; bh=eXuvVLsIoJTtBSrllPg+LbvP5hevaIXkGvrpXESizSw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Yu8Cm7TQEJH9yua9hSts/KClk42Ya+a3bP2vJZYMk9pzBlli1I+JzZc3J6h4xL1sb yhVefsC99/Z3lC6o1uLbE9usFkr+kgVBqX41pcd6X/wPUNuez/4B2pKHOosmZKeNAw OFK7XvGDSRXnzXQMAxKUCP4QvFKVZGrCLQFhCiu0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Arnd Bergmann , syzbot+1115e79c8df6472c612b@syzkaller.appspotmail.com, Sakari Ailus , Arnd Bergmann , Hans Verkuil , Laurent Pinchart , Mauro Carvalho Chehab Subject: [PATCH 5.4 69/72] media: v4l: ioctl: Fix memory leak in video_usercopy Date: Fri, 5 Mar 2021 13:22:11 +0100 Message-Id: <20210305120900.714856623@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210305120857.341630346@linuxfoundation.org> References: <20210305120857.341630346@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sakari Ailus commit fb18802a338b36f675a388fc03d2aa504a0d0899 upstream. When an IOCTL with argument size larger than 128 that also used array arguments were handled, two memory allocations were made but alas, only the latter one of them was released. This happened because there was only a single local variable to hold such a temporary allocation. Fix this by adding separate variables to hold the pointers to the temporary allocations. Reported-by: Arnd Bergmann Reported-by: syzbot+1115e79c8df6472c612b@syzkaller.appspotmail.com Fixes: d14e6d76ebf7 ("[media] v4l: Add multi-planar ioctl handling code") Cc: stable@vger.kernel.org Signed-off-by: Sakari Ailus Acked-by: Arnd Bergmann Acked-by: Hans Verkuil Reviewed-by: Laurent Pinchart Signed-off-by: Mauro Carvalho Chehab Signed-off-by: Greg Kroah-Hartman --- drivers/media/v4l2-core/v4l2-ioctl.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -3016,7 +3016,7 @@ video_usercopy(struct file *file, unsign v4l2_kioctl func) { char sbuf[128]; - void *mbuf = NULL; + void *mbuf = NULL, *array_buf = NULL; void *parg = (void *)arg; long err = -EINVAL; bool has_array_args; @@ -3075,20 +3075,14 @@ video_usercopy(struct file *file, unsign has_array_args = err; if (has_array_args) { - /* - * When adding new types of array args, make sure that the - * parent argument to ioctl (which contains the pointer to the - * array) fits into sbuf (so that mbuf will still remain - * unused up to here). - */ - mbuf = kvmalloc(array_size, GFP_KERNEL); + array_buf = kvmalloc(array_size, GFP_KERNEL); err = -ENOMEM; - if (NULL == mbuf) + if (array_buf == NULL) goto out_array_args; err = -EFAULT; - if (copy_from_user(mbuf, user_ptr, array_size)) + if (copy_from_user(array_buf, user_ptr, array_size)) goto out_array_args; - *kernel_ptr = mbuf; + *kernel_ptr = array_buf; } /* Handles IOCTL */ @@ -3107,7 +3101,7 @@ video_usercopy(struct file *file, unsign if (has_array_args) { *kernel_ptr = (void __force *)user_ptr; - if (copy_to_user(user_ptr, mbuf, array_size)) + if (copy_to_user(user_ptr, array_buf, array_size)) err = -EFAULT; goto out_array_args; } @@ -3129,6 +3123,7 @@ out_array_args: } out: + kvfree(array_buf); kvfree(mbuf); return err; }