Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp2718679pxy; Mon, 3 May 2021 06:35:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwgVvV3LBuB0ap1i7hr+r4NoyTFXfgWqjC7HhATh0s0aPIpTk4eWQD2dVL8FDB+yZe+Ao5l X-Received: by 2002:a17:90b:30b:: with SMTP id ay11mr1813415pjb.75.1620048945806; Mon, 03 May 2021 06:35:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620048945; cv=none; d=google.com; s=arc-20160816; b=hht5V3RJxNELl6oOpHX9wpqXGy6TaF/dg3npq287IhSlqOpdaZCCtK7Z+HmV+9r+FY IamEsjXesUqQ3gQjZUCjVaPiAlvJOVQSOEpZxEfLdQMyxz41BYVt2dy6sn8+kufkCmW+ +p3ILJCFcM6xzckInqaYkMZCHi8tqiolfo67fz54QIvIDHqueTT8dFCpUgxx/JOBmNWM 98FBPhJaa4t3kIQdTLZYr9wQscsPzDikCgIt61hPzdzNmkXch0qjeKY7tVC5YQERTspq VkCXl+SfwlVWQ6fpxGnnPwe7wjmGF6jmDwZys92Cg3AKuAmM3GLjXZFypxmEeFZDJXEw 3q+Q== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=b/u7wVA9Y4Yfsb1UKjT/I0UpxDG4PxV46u6sonZ49vU=; b=xTp/DbD7YZSJZSlwCI8C/mBNGAGDxmt/JwQb+77NGxqLO8+eqYkuBlSKVHP8JGTIug TNJJcHx0zhQTj3FG9EZGbde/W006cELtpP4c1uzGtgT5vtZJkXKL8yG9lcFn7PWb8T6h hOZWhUP2JgsxbGNqyO+13EPJO8PC2VSD+cxFTvSrmiVgAHDrfn2+vS7qwnZt7b0Oprub IvMxH1AZ7YT6NjY/QMX/RKx0kq8N6W7PMRKfzuu7TUnZIi0e7OEK/X/r4aEWdtRXxeN8 u8d2Me0lHszdkrsaMFxEpiZYdri4Y3XOpK/arIvB1hKLiQVZTqACGLIgH4nOohVwx+aq ZpAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QbXFN1V7; 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 r21si15211200pjp.98.2021.05.03.06.35.33; Mon, 03 May 2021 06:35:45 -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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QbXFN1V7; 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 S234132AbhECME1 (ORCPT + 99 others); Mon, 3 May 2021 08:04:27 -0400 Received: from mail.kernel.org ([198.145.29.99]:37516 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234145AbhECMCX (ORCPT ); Mon, 3 May 2021 08:02:23 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8C4DC6127A; Mon, 3 May 2021 12:01:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620043290; bh=B0qE38QJYC4ujeFcl48cz4uglrUrlb1tnFwKN3arwhE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QbXFN1V7uWlYJOqwrhz/jSQhiEZrVpRu8OMJdmK58klUH/4eJjx1OvZeK7CMuiAFB Q0p/hoCoquNenc2OV5boTv329agRbpIPSVwl3ML5ODqHiStVjrKXBs7HK7L+p9/FG6 o0eTOW455LEw9JB3jIQc/fMTeV0enop69UXCG5Nc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Phillip Potter , "David S . Miller" , Greg Kroah-Hartman Subject: [PATCH 41/69] isdn: mISDNinfineon: check/cleanup ioremap failure correctly in setup_io Date: Mon, 3 May 2021 13:57:08 +0200 Message-Id: <20210503115736.2104747-42-gregkh@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210503115736.2104747-1-gregkh@linuxfoundation.org> References: <20210503115736.2104747-1-gregkh@linuxfoundation.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Phillip Potter Move hw->cfg.mode and hw->addr.mode assignments from hw->ci->cfg_mode and hw->ci->addr_mode respectively, to be before the subsequent checks for memory IO mode (and possible ioremap calls in this case). Also introduce ioremap error checks at both locations. This allows resources to be properly freed on ioremap failure, as when the caller of setup_io then subsequently calls release_io via its error path, release_io can now correctly determine the mode as it has been set before the ioremap call. Finally, refactor release_io function so that it will call release_mem_region in the memory IO case, regardless of whether or not hw->cfg.p/hw->addr.p are NULL. This means resources are then properly released on failure. This properly implements the original reverted commit (d721fe99f6ad) from the University of Minnesota, whilst also implementing the ioremap check for the hw->ci->cfg_mode if block as well. Cc: David S. Miller Signed-off-by: Phillip Potter Signed-off-by: Greg Kroah-Hartman --- drivers/isdn/hardware/mISDN/mISDNinfineon.c | 24 ++++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/isdn/hardware/mISDN/mISDNinfineon.c b/drivers/isdn/hardware/mISDN/mISDNinfineon.c index fa9c491f9c38..88d592bafdb0 100644 --- a/drivers/isdn/hardware/mISDN/mISDNinfineon.c +++ b/drivers/isdn/hardware/mISDN/mISDNinfineon.c @@ -630,17 +630,19 @@ static void release_io(struct inf_hw *hw) { if (hw->cfg.mode) { - if (hw->cfg.p) { + if (hw->cfg.mode == AM_MEMIO) { release_mem_region(hw->cfg.start, hw->cfg.size); - iounmap(hw->cfg.p); + if (hw->cfg.p) + iounmap(hw->cfg.p); } else release_region(hw->cfg.start, hw->cfg.size); hw->cfg.mode = AM_NONE; } if (hw->addr.mode) { - if (hw->addr.p) { + if (hw->addr.mode == AM_MEMIO) { release_mem_region(hw->addr.start, hw->addr.size); - iounmap(hw->addr.p); + if (hw->addr.p) + iounmap(hw->addr.p); } else release_region(hw->addr.start, hw->addr.size); hw->addr.mode = AM_NONE; @@ -670,9 +672,12 @@ setup_io(struct inf_hw *hw) (ulong)hw->cfg.start, (ulong)hw->cfg.size); return err; } - if (hw->ci->cfg_mode == AM_MEMIO) - hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size); hw->cfg.mode = hw->ci->cfg_mode; + if (hw->ci->cfg_mode == AM_MEMIO) { + hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size); + if (!hw->cfg.p) + return -ENOMEM; + } if (debug & DEBUG_HW) pr_notice("%s: IO cfg %lx (%lu bytes) mode%d\n", hw->name, (ulong)hw->cfg.start, @@ -697,9 +702,12 @@ setup_io(struct inf_hw *hw) (ulong)hw->addr.start, (ulong)hw->addr.size); return err; } - if (hw->ci->addr_mode == AM_MEMIO) - hw->addr.p = ioremap(hw->addr.start, hw->addr.size); hw->addr.mode = hw->ci->addr_mode; + if (hw->ci->addr_mode == AM_MEMIO) { + hw->addr.p = ioremap(hw->addr.start, hw->addr.size); + if (!hw->addr.p) + return -ENOMEM; + } if (debug & DEBUG_HW) pr_notice("%s: IO addr %lx (%lu bytes) mode%d\n", hw->name, (ulong)hw->addr.start, -- 2.31.1