Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2512519imm; Mon, 28 May 2018 09:29:12 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpnP4/oOVEq8NqrvItsChgcXlXcwxlPuRVqEzIIzwlq9onYMG2o8mSFEy3NFi1yTt+CqFTX X-Received: by 2002:a62:5959:: with SMTP id n86-v6mr14201472pfb.217.1527524951954; Mon, 28 May 2018 09:29:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527524951; cv=none; d=google.com; s=arc-20160816; b=F9R7XW3KuLZepeuonmkfTZ3Xusn2Ja8gkGgwUxGzXVdgVi3MPgK3I6dPbxMyQdCNPM gAM9nv5f9q40cJCOb6aQ9/7EU+NUkqjAczZduC6NFTvjDfHMLXrLHRMJAX96Oi1ZdF3z kLn4Z7BkemNEaSS21KXxMwhZd//pE776mv9Wz2xODorZ3otPW5pa+LVhyGtJzWD9Qk/g yM+3a+nwmgtb6bULc3yrP2k+IQ13mK4+/+wVnW03lrjQ+7l1NDXfM9TCUFmloSL76Ng8 nLct6QJSwQ1wCh3E2tdRrxJaat49DFPRK/qCLf2jUGS4/jSLBRTrRd+Y/eCZJud+vPbW 844A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=ZBRFjIJ3QmtK/kzcjVAKzq1sTxUr5S101utp87iBc/Q=; b=1Bkchj8DnSQojZBByVkHnuHre+DMh+m/i0OeBolHcUnA37T4xVj+weIfTKO9d+7MoY 5J8ztsnIUvECvds6F4olL2qSqB7V1zMKieo3yE0OfVe2jAi/G64XdEg7hpk7EDOSlID0 8MAntbDf7lszNtxcVPjEI67CFANdtuPv9FpGNuM7yictaeTrsVkkTvIGldrIaeSPqaT2 5nplaFYZC2DFHPVGoiwPzS6ou5V4VBFCgsdkhIgxpVMD2FIIlFTTjZhC7mQa56RNzNSa cm0hfhJNgM4Lw001+X/xZLHo8pNWp14vwxNsgO4taSltcSkbiIyWUqUk0dt9pBR2wzqq kH/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UOjtwnm0; 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 p91-v6si30550042plb.457.2018.05.28.09.28.57; Mon, 28 May 2018 09:29:11 -0700 (PDT) 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=UOjtwnm0; 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 S940097AbeE1Q2W (ORCPT + 99 others); Mon, 28 May 2018 12:28:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:58322 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932273AbeE1KKK (ORCPT ); Mon, 28 May 2018 06:10:10 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (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 2C23F2086D; Mon, 28 May 2018 10:10:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527502209; bh=ZhT3EyxELVO7f+AB/MiqOX+DXjLwcj4SKXaBOb5MQm0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UOjtwnm0fhxVMarqWcvYDyFkYYSRf++zHA2FS8wmiGIBXiqJ9/1bNZs2y3bz0cPWQ /nkgjpmgKaAAt+nDp33QiCWw3+1oVnK/zKq8H493bIWzgURmVCKlc5iCPsodZf8IRw NNKG6hukQ/DU5BKrLzXSbDUOi3YrzKH2TBPdDQ4E= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, NeilBrown , Yufen Yu , Shaohua Li , Sasha Levin Subject: [PATCH 3.18 073/185] md/raid1: fix NULL pointer dereference Date: Mon, 28 May 2018 12:01:54 +0200 Message-Id: <20180528100056.996697552@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100050.700971285@linuxfoundation.org> References: <20180528100050.700971285@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.18-stable review patch. If anyone has any objections, please let me know. ------------------ From: Yufen Yu [ Upstream commit 3de59bb9d551428cbdc76a9ea57883f82e350b4d ] In handle_write_finished(), if r1_bio->bios[m] != NULL, it thinks the corresponding conf->mirrors[m].rdev is also not NULL. But, it is not always true. Even if some io hold replacement rdev(i.e. rdev->nr_pending.count > 0), raid1_remove_disk() can also set the rdev as NULL. That means, bios[m] != NULL, but mirrors[m].rdev is NULL, resulting in NULL pointer dereference in handle_write_finished and sync_request_write. This patch can fix BUGs as follows: BUG: unable to handle kernel NULL pointer dereference at 0000000000000140 IP: [] raid1d+0x2bd/0xfc0 PGD 12ab52067 PUD 12f587067 PMD 0 Oops: 0000 [#1] SMP CPU: 1 PID: 2008 Comm: md3_raid1 Not tainted 4.1.44+ #130 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1.fc26 04/01/2014 Call Trace: ? schedule+0x37/0x90 ? prepare_to_wait_event+0x83/0xf0 md_thread+0x144/0x150 ? wake_atomic_t_function+0x70/0x70 ? md_start_sync+0xf0/0xf0 kthread+0xd8/0xf0 ? kthread_worker_fn+0x160/0x160 ret_from_fork+0x42/0x70 ? kthread_worker_fn+0x160/0x160 BUG: unable to handle kernel NULL pointer dereference at 00000000000000b8 IP: sync_request_write+0x9e/0x980 PGD 800000007c518067 P4D 800000007c518067 PUD 8002b067 PMD 0 Oops: 0000 [#1] SMP PTI CPU: 24 PID: 2549 Comm: md3_raid1 Not tainted 4.15.0+ #118 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1.fc26 04/01/2014 Call Trace: ? sched_clock+0x5/0x10 ? sched_clock_cpu+0xc/0xb0 ? flush_pending_writes+0x3a/0xd0 ? pick_next_task_fair+0x4d5/0x5f0 ? __switch_to+0xa2/0x430 raid1d+0x65a/0x870 ? find_pers+0x70/0x70 ? find_pers+0x70/0x70 ? md_thread+0x11c/0x160 md_thread+0x11c/0x160 ? finish_wait+0x80/0x80 kthread+0x111/0x130 ? kthread_create_worker_on_cpu+0x70/0x70 ? do_syscall_64+0x6f/0x190 ? SyS_exit_group+0x10/0x10 ret_from_fork+0x35/0x40 Reviewed-by: NeilBrown Signed-off-by: Yufen Yu Signed-off-by: Shaohua Li Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/md/raid1.c | 11 +++++++++++ 1 file changed, 11 insertions(+) --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1722,6 +1722,17 @@ static int raid1_remove_disk(struct mdde struct md_rdev *repl = conf->mirrors[conf->raid_disks + number].rdev; freeze_array(conf, 0); + if (atomic_read(&repl->nr_pending)) { + /* It means that some queued IO of retry_list + * hold repl. Thus, we cannot set replacement + * as NULL, avoiding rdev NULL pointer + * dereference in sync_request_write and + * handle_write_finished. + */ + err = -EBUSY; + unfreeze_array(conf); + goto abort; + } clear_bit(Replacement, &repl->flags); p->rdev = repl; conf->mirrors[conf->raid_disks + number].rdev = NULL;