Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2465654imm; Mon, 28 May 2018 08:35:32 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLz2FnJzfOoLYZGSfO1pCboriObKjZzabvCRrHnsI6K/XVEwbC+pkAVzzmwG4etBxc+VHy4 X-Received: by 2002:a17:902:8bc6:: with SMTP id r6-v6mr9567687plo.257.1527521732488; Mon, 28 May 2018 08:35:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527521732; cv=none; d=google.com; s=arc-20160816; b=RgArrJlFUswpnvErUgSSU2Gs/oL2KixrUSxJlkmNlr2s21fwGvd9prRBpfmiWp7IAl MQnDXMBTc3/Os3JiCHqiccT8AuDr+koPo+f3FC5dku2unjhBwxh1BniLt0tnSKLyOtDV YjvVweWqL+GMgWrwrbwOUY4bIxB+qZCPLzrfKiSDB088WK63n1lsXBoNQzO8xhgyzb4z NX0c6wMPNvYoM+qDoZS5IxS6h1lxLUev3NSfhxyryuLsKup5hewpYGrX0UAx7wMF9mmT Qjdf8x8jKzI75Rjut38xcoYPxjgXg+EfhT1tpeFMMaHWyO6A0Jjyc1IKjM4mCMv1glnR 3hWA== 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=jrBzmZnq4WMsXLLr+7ARxMFRFmPwE0d78x6TwrGyPg8=; b=vs/7qwK1PG/0eeTyI8h/yj0Iim6BYkOZgWZ3QEI2HcCxXZcE8r/lc/4BIb0PX/tC+t a9cCSCHdiXJ4AVh+vD4J+kE8fdDRbHLrzX1oYnCYae5w22WC9uhnd8uku8d9u4ViTSoz mvqEzsYhkghMx/eKOT0ILpt0Y10Be41qhDrNphKSjvFpPLowwp2w75cy2MTbXmxR2qDv L2CJG506DR4IexgmFZDTsgifuxR3JaRM7Bd7N20BJyDkxewKklw0Ie+nhJHEpc63uGPZ pfox0SCGn4G2LF9XiqggZmyTl15FZyHIxDTDnlw52lvztNCBKinBGS2IdxuV9yKeDwJ2 OwmA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UTQSEBqO; 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 l67-v6si30459538pfg.326.2018.05.28.08.35.17; Mon, 28 May 2018 08:35:32 -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=UTQSEBqO; 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 S1034557AbeE1Pen (ORCPT + 99 others); Mon, 28 May 2018 11:34:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:38820 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031841AbeE1KSs (ORCPT ); Mon, 28 May 2018 06:18:48 -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 11D3B2089E; Mon, 28 May 2018 10:18:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527502727; bh=Q86M0dySg6P2d6snSOvAewl+015aldE0NiK1rikYizA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UTQSEBqOnbGtGUzUp2MTgpU6ZJBqYqX1yDFZhZow5kNlLzVXkAGEgJrOhVVrE2BT5 A8yyqBQrLvl1PncEj7sG663nJjrqB31YZIS7Y+TOaBPqfEJcXs53oSZ9cwOy5KcAhL X0KInhonyj387tUfy3glUyTEbE8h9EPE0ebvdbck= 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 4.4 106/268] md/raid1: fix NULL pointer dereference Date: Mon, 28 May 2018 12:01:20 +0200 Message-Id: <20180528100214.188956331@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180528100202.045206534@linuxfoundation.org> References: <20180528100202.045206534@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 4.4-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 @@ -1686,6 +1686,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;