Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp501920pxb; Fri, 15 Oct 2021 09:49:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyOfVGMbuL6jjHidoy9wqLzC3m3qXPeE2HUibCfqJf7JcY7gnhWKpBr0FLiin4WBca0nGM1 X-Received: by 2002:a05:6402:11ca:: with SMTP id j10mr19100749edw.223.1634316584738; Fri, 15 Oct 2021 09:49:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634316584; cv=none; d=google.com; s=arc-20160816; b=aqBc74GmcmKdMkZCBIu+WeQaV+0FXz5Yldd534mr74OP92xthp420IAfhpDOJ8hWMh kB969vd+BB8epDKvlbULYnwSnaLVEGR9jFRsvOu7X/o3E5fQ7zfRSdHNpXLHJizgXl20 UoLJymmgIvnJF/k7hg+aiOzjUHODMD8swosdfiuGRIz4ZsKIQ7giR7pAaf7QIoxwy/bX OvQCu6szIg1rRJcbrhAaJ183gKBoFHQFaq0ju5swY5GeDO4GQtNgetvlTu0OmBFvHaKk db5wU0i2KDhPmjrq7lQsLW38NS8P+W5mAZA+uJNdaPIeA3mjiDTzhy3hpjaw3AsPYIoK ZDQA== 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 :message-id:date:subject:cc:to:from; bh=gmdt3QAFPvINLG5Rpk8+H1VCWfr/wgYvg6FNZS9jMOE=; b=D074EkUT8InjjITQKH+3CwMmrRxt3QtU3B1sXwqlWnm3WJ8Daq97kqd9G9hf2NI4ei 5m7OILqI+56dv8vnDFBD+vn3F4xY6zNwaVVcPZEzbUlku4G0nWOpCPcJzeKDHHJzPLi8 JGWV8jb61yB/do2N1ep3jyfop7H+UmrS12yT2blfbFFU+BBobP2ds8eNG4W4vDoJohbq DF9FtPQQY6NFoysqy+X8zZgIP2JiuRNthhTXg+lfATnwPDkFRhi6qXmr2f4jpKhGVqIj IENZfGQbCYp+y0r4fDJCGz0E6C3N0kkVgb7Feu55karWHrz1w08v6q7NFYzq8D6hQ6uS WGDA== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c19si8040758edj.149.2021.10.15.09.49.21; Fri, 15 Oct 2021 09:49:44 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235553AbhJOJAo (ORCPT + 99 others); Fri, 15 Oct 2021 05:00:44 -0400 Received: from szxga02-in.huawei.com ([45.249.212.188]:24321 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229656AbhJOJAn (ORCPT ); Fri, 15 Oct 2021 05:00:43 -0400 Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.53]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4HW0SF2s2Czbd24; Fri, 15 Oct 2021 16:54:05 +0800 (CST) Received: from kwepemm600001.china.huawei.com (7.193.23.3) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.8; Fri, 15 Oct 2021 16:58:35 +0800 Received: from huawei.com (10.175.104.82) by kwepemm600001.china.huawei.com (7.193.23.3) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.8; Fri, 15 Oct 2021 16:58:34 +0800 From: Wang Hai To: CC: , Subject: [PATCH] media: dmxdev: fix UAF when dvb_register_device() fails Date: Fri, 15 Oct 2021 16:57:41 +0800 Message-ID: <20211015085741.1203283-1-wanghai38@huawei.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-Originating-IP: [10.175.104.82] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemm600001.china.huawei.com (7.193.23.3) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I got a use-after-free report: dvbdev: dvb_register_device: failed to create device dvb1.dvr0 (-12) ... ================================================================== BUG: KASAN: use-after-free in dvb_dmxdev_release+0xce/0x2f0 ... Call Trace: dump_stack_lvl+0x6c/0x8b print_address_description.constprop.0+0x48/0x70 kasan_report.cold+0x82/0xdb __asan_load4+0x6b/0x90 dvb_dmxdev_release+0xce/0x2f0 ... Allocated by task 7666: kasan_save_stack+0x23/0x50 __kasan_kmalloc+0x83/0xa0 kmem_cache_alloc_trace+0x22e/0x470 dvb_register_device+0x12f/0x980 dvb_dmxdev_init+0x1f3/0x230 ... Freed by task 7666: kasan_save_stack+0x23/0x50 kasan_set_track+0x20/0x30 kasan_set_free_info+0x24/0x40 __kasan_slab_free+0xf2/0x130 kfree+0xd1/0x5c0 dvb_register_device.cold+0x1ac/0x1fa dvb_dmxdev_init+0x1f3/0x230 ... When dvb_register_device() in dvb_dmxdev_init() fails, dvb_dmxdev_init() does not return a failure, and the memory pointed to by dvbdev or dvr_dvbdev is invalid at this point. If they are used subsequently, it will result in UFA or null-ptr-deref. If dvb_register_device() in dvb_dmxdev_init() fails, fix the bug by making dvb_dmxdev_init() return an error as well. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Reported-by: Hulk Robot Signed-off-by: Wang Hai --- drivers/media/dvb-core/dmxdev.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c index 5d5a48475a54..01f288fa37e0 100644 --- a/drivers/media/dvb-core/dmxdev.c +++ b/drivers/media/dvb-core/dmxdev.c @@ -1413,7 +1413,7 @@ static const struct dvb_device dvbdev_dvr = { }; int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) { - int i; + int i, ret; if (dmxdev->demux->open(dmxdev->demux) < 0) return -EUSERS; @@ -1432,14 +1432,26 @@ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) DMXDEV_STATE_FREE); } - dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, + ret = dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, DVB_DEVICE_DEMUX, dmxdev->filternum); - dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, + if (ret < 0) + goto err_register_dvbdev; + + ret = dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, dmxdev, DVB_DEVICE_DVR, dmxdev->filternum); + if (ret < 0) + goto err_register_dvr_dvbdev; dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192); return 0; + +err_register_dvr_dvbdev: + dvb_unregister_device(dmxdev->dvbdev); +err_register_dvbdev: + vfree(dmxdev->filter); + dmxdev->filter = NULL; + return ret; } EXPORT_SYMBOL(dvb_dmxdev_init); -- 2.25.1