Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp697006ybv; Thu, 13 Feb 2020 07:57:02 -0800 (PST) X-Google-Smtp-Source: APXvYqzbvABlRwLmy5rteuLgqPOoPXkoRXYnFT5QGqlhQufRTy8knev7n3Bb+4Pi+S14MZNHB2FD X-Received: by 2002:aca:5254:: with SMTP id g81mr3428142oib.61.1581609422275; Thu, 13 Feb 2020 07:57:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1581609422; cv=none; d=google.com; s=arc-20160816; b=hlKuADl2fl68xGN2JxJAR+/UlIkD9HURO51ga03xanbT1iQyVif1t4D/KUM+YNsTgi c9mEijhBMpc1XBBBawdo6uv5KlULMpm4ZgfjAmLZ4VDyB9R/9Eh4prMLpKz8ttx4MFQ8 wJN9Yt56FqZlA4PNw+Rs4XwV1egueG0DzAL9NIQ5GwjYHsnLAoNvJqfvMwSJcLvP1RaL qa/5LkCvlH5xP4vyxRQMY83gCcYuUfpa3+IDeppYY7IzPps9ckPuL/XEVMwdhiEHkWYK o5nGjkA98/5Nb/5fTW7/n15KZTSVCBivUETKzt6OOhWkP7bPrx3DAFYszcaHMJrfBSST Z9Kw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=fnYfRaVld1ZGvbC1mP3hQYli+vtA4dsBEV5K4hurMEU=; b=rlZlgJ+XgZrEqlalmx9DMrIwjmEdbvw6w/w8C/mGfMRGyfJ60H/M70ykEM587/3ftP mqQNNzY1R+baC5YE+YZEfG7lWRb0vLqbYdEAVblsWvq/1FIgoDH1ktZmkl/8HVARL1t5 KGHhfcsXJTMTxkefNJRmOHYF41A/m7rVrE56YIBkS+huw3JHlRsYKohx7/8V/Rw48v7p Ybc8JuhAVmro2U2itVxCPt8dC47PV7KDPQSwhlH+DKcg0Y04w7qgUNtNXL6xHZ5IuRZQ zr8OA+tD4XZlWQdsr+lhfPu7GgVCn1UjH8H+3nxSQ/H6g+RKjnpm5MGdr+A4PgthJ5Nl +u6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=AjGqU1Ov; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j20si1371169oii.80.2020.02.13.07.56.49; Thu, 13 Feb 2020 07:57:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=AjGqU1Ov; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387440AbgBMPZb (ORCPT + 99 others); Thu, 13 Feb 2020 10:25:31 -0500 Received: from mail.kernel.org ([198.145.29.99]:36184 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728539AbgBMPX4 (ORCPT ); Thu, 13 Feb 2020 10:23:56 -0500 Received: from localhost (unknown [104.132.1.104]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 8526724691; Thu, 13 Feb 2020 15:23:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1581607435; bh=+n9UQHxAvQgQFJMau27dS5mtw+cO/bqHPKaO4xMeHrA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AjGqU1OveDs7GNWrXZUacsiWWaHFK1w64Hn697jhWpDN0aRvyZicq0djqWqF7JuMO 5lHIbPmddqvzhHs+zUZTg6v8IAA2xCmUoqRT1WTET4VMjS37pPlT0ezM8D+S5DCgA1 V6rBWMAvXm5FflrTw2C31fFQ0ED1NVGW8yytNVa4= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Dan Carpenter , Richard Weinberger Subject: [PATCH 4.9 071/116] ubi: Fix an error pointer dereference in error handling code Date: Thu, 13 Feb 2020 07:20:15 -0800 Message-Id: <20200213151910.510226175@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200213151842.259660170@linuxfoundation.org> References: <20200213151842.259660170@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dan Carpenter commit 5d3805af279c93ef49a64701f35254676d709622 upstream. If "seen_pebs = init_seen(ubi);" fails then "seen_pebs" is an error pointer and we try to kfree() it which results in an Oops. This patch re-arranges the error handling so now it only frees things which have been allocated successfully. Fixes: daef3dd1f0ae ("UBI: Fastmap: Add self check to detect absent PEBs") Signed-off-by: Dan Carpenter Signed-off-by: Richard Weinberger Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/ubi/fastmap.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) --- a/drivers/mtd/ubi/fastmap.c +++ b/drivers/mtd/ubi/fastmap.c @@ -1127,7 +1127,7 @@ static int ubi_write_fastmap(struct ubi_ struct rb_node *tmp_rb; int ret, i, j, free_peb_count, used_peb_count, vol_count; int scrub_peb_count, erase_peb_count; - unsigned long *seen_pebs = NULL; + unsigned long *seen_pebs; fm_raw = ubi->fm_buf; memset(ubi->fm_buf, 0, ubi->fm_size); @@ -1141,7 +1141,7 @@ static int ubi_write_fastmap(struct ubi_ dvbuf = new_fm_vbuf(ubi, UBI_FM_DATA_VOLUME_ID); if (!dvbuf) { ret = -ENOMEM; - goto out_kfree; + goto out_free_avbuf; } avhdr = ubi_get_vid_hdr(avbuf); @@ -1150,7 +1150,7 @@ static int ubi_write_fastmap(struct ubi_ seen_pebs = init_seen(ubi); if (IS_ERR(seen_pebs)) { ret = PTR_ERR(seen_pebs); - goto out_kfree; + goto out_free_dvbuf; } spin_lock(&ubi->volumes_lock); @@ -1318,7 +1318,7 @@ static int ubi_write_fastmap(struct ubi_ ret = ubi_io_write_vid_hdr(ubi, new_fm->e[0]->pnum, avbuf); if (ret) { ubi_err(ubi, "unable to write vid_hdr to fastmap SB!"); - goto out_kfree; + goto out_free_seen; } for (i = 0; i < new_fm->used_blocks; i++) { @@ -1340,7 +1340,7 @@ static int ubi_write_fastmap(struct ubi_ if (ret) { ubi_err(ubi, "unable to write vid_hdr to PEB %i!", new_fm->e[i]->pnum); - goto out_kfree; + goto out_free_seen; } } @@ -1350,7 +1350,7 @@ static int ubi_write_fastmap(struct ubi_ if (ret) { ubi_err(ubi, "unable to write fastmap to PEB %i!", new_fm->e[i]->pnum); - goto out_kfree; + goto out_free_seen; } } @@ -1360,10 +1360,13 @@ static int ubi_write_fastmap(struct ubi_ ret = self_check_seen(ubi, seen_pebs); dbg_bld("fastmap written!"); -out_kfree: - ubi_free_vid_buf(avbuf); - ubi_free_vid_buf(dvbuf); +out_free_seen: free_seen(seen_pebs); +out_free_dvbuf: + ubi_free_vid_buf(dvbuf); +out_free_avbuf: + ubi_free_vid_buf(avbuf); + out: return ret; }