Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1979796pxb; Fri, 5 Mar 2021 04:40:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJwx4qCOlhxu+1YGdwvINLOxRqfeK4KpL16aLyCTPH8KTa9hssaZ6WYZ1eDDoHeraKY3Opxp X-Received: by 2002:aa7:c441:: with SMTP id n1mr8557324edr.203.1614948025998; Fri, 05 Mar 2021 04:40:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614948025; cv=none; d=google.com; s=arc-20160816; b=KbFgMQOJI71xa/5LX7aDzUOtaleRIivZiDYkN769lfBrzlNjB9NAel7z56wk3ya6/f 6GQQN8D6FUBuOX/x2jBx3h73K83t1f0aF7R3VBKRdyclbpf0/PeEzXpx5DSFkGENrDAp ZLQL6cMMNJ88ZHLJpgHGdG1OUSN39oMLLdUDPjrrJEFpnvVl71e9HCRrGJn8yRWNOUF1 ZH6cpnMJ/59hXZWXX8UKdMEZLWnBeK2WkndprZw536C5+0ljOr0IiA3FztMpEY2be5iD Kh1UKnT8KjENJp+MqOUHROe/aHXbHdMphb/rF/KW+77RrJjbmrMvWkAVzg2FhC96C7Bs mgtg== 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=oFyuT8lG55WRtPnZ9n7HQl4GS7Brz0qAHFkDkQuLYIk=; b=N3jR+2Ijeo+bYIp2Q4ZF3n6uPPUM+tkw0LjDEwOCl2m9e6tTcUnxL997qFDvF6J3cK eHLOzooXKfErxsjNHWKBYfgBxRBb5y+miVThWWFc63gYv2t0p29T7eW3hBkuRexBTBOP StHsDRMdfCLjlxquV8DmBn3Mc3SUQlsjGqeByslu7J78sAXLmLUYjkYbesptOUmQ6tR+ szRL9u23Z9ESEAwWIEszOQ+eaQwpX1QythlQG88VjMxugKDsBYODk23qEQmzy+vN9+Ao WAUuE0t9jdZEkvKDYV50QI0m55QiHp6Y+RvmSYujOTRYymJP/iAEm/TLI6ZI5h/pjLHo P9RA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=NXz3exwD; 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 h12si1384693ejx.150.2021.03.05.04.40.03; Fri, 05 Mar 2021 04:40:25 -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=NXz3exwD; 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 S233235AbhCEMjD (ORCPT + 99 others); Fri, 5 Mar 2021 07:39:03 -0500 Received: from mail.kernel.org ([198.145.29.99]:51976 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229759AbhCEMiQ (ORCPT ); Fri, 5 Mar 2021 07:38:16 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 6DA5065030; Fri, 5 Mar 2021 12:38:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614947896; bh=eRWpS8/FiFTXMIgt9svYfyM6K5IbWgyA7RW/iy/bypc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NXz3exwDn39iZde5GE4899vvup3Ow47/ZSS4IioI0d3CbosUOckDSC1UfXvyEyoid CQWt+DO6d9Q84Ry3khZtIZQcBJYdNcCvL5K7GwZmILTRDw9GG2X68Qe/LqTxevoXBf VUNJh0GpBOwInBmoF63+kkHyeVIIsYxva71sdrPI= 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 4.19 50/52] media: v4l: ioctl: Fix memory leak in video_usercopy Date: Fri, 5 Mar 2021 13:22:21 +0100 Message-Id: <20210305120856.115599458@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210305120853.659441428@linuxfoundation.org> References: <20210305120853.659441428@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 @@ -2939,7 +2939,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; @@ -2998,20 +2998,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 */ @@ -3030,7 +3024,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; } @@ -3052,6 +3046,7 @@ out_array_args: } out: + kvfree(array_buf); kvfree(mbuf); return err; }