From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C8558C4332F for ; Tue, 20 Dec 2022 01:22:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 251DB8E0005; Mon, 19 Dec 2022 20:22:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 201F48E0001; Mon, 19 Dec 2022 20:22:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0C9C08E0005; Mon, 19 Dec 2022 20:22:27 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id F1A658E0001 for ; Mon, 19 Dec 2022 20:22:26 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id D0B8E40C43 for ; Tue, 20 Dec 2022 01:22:26 +0000 (UTC) X-FDA: 80260934292.28.E16127F Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by imf22.hostedemail.com (Postfix) with ESMTP id 2CB83C0006 for ; Tue, 20 Dec 2022 01:22:24 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Kvt6LWVA; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf22.hostedemail.com: domain of sashal@kernel.org designates 145.40.68.75 as permitted sender) smtp.mailfrom=sashal@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1671499345; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=zK6v9abbwr+FoPWsMSWortEbi3UJVEVuM0b6W20ZKkQ=; b=1BTTtr9Frx06c3fOvPQwAKBcKwaxoybwXGqXiStfIwKIG05IF02NNYsAW+J4lJ+rWZ3TVv MFwpcYoCKG3PDkBJRuRjrcm3Ce0Nk6M1l2EzQfs6u13gRWQZUQkc34CrW+8kdl1UBJegtW BnxR+tuNc8Gp9JI8jFN4flUYzfQdhhU= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Kvt6LWVA; dmarc=pass (policy=none) header.from=kernel.org; spf=pass (imf22.hostedemail.com: domain of sashal@kernel.org designates 145.40.68.75 as permitted sender) smtp.mailfrom=sashal@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1671499345; a=rsa-sha256; cv=none; b=q3RqAabP27FnCX9znYRQYLDIJ9GVDMHs4ST2fv3dyUPp2eKXGR99p7g5POZmimvFXn85yv 72POZVi3ZluNsX3RJdsLAnt+b4g0AMEedypgPca7ah/PFl9JAE1cP4leGXL6/JMWKFL/7r 4U1SNSYshmH45xu/maTEXjW7tDr8YI4= Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 1AD98B80FA6; Tue, 20 Dec 2022 01:22:23 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A0D2AC433EF; Tue, 20 Dec 2022 01:22:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1671499341; bh=YQKS/rpStmGrZKPeSL0eAJmUklWKF0SSZbbLL7gi+k0=; h=From:To:Cc:Subject:Date:From; b=Kvt6LWVAS5wEYDfK+6McqNzKuznJjX4U4ZChgxa6dUSu2vW4P8h7SbgREwQQRrOJN Sel/saI3ApnVuEqz1Jh4QzF4ttcKSNEMbCvh99U2fsGDNQ4jWVLzh4AfArU56AA0qR UqNFG3HhC6S6crFJ9jMsBv9pCot7alYIwYs2DLGUQj4hOZgvkKsKJz2iCfbBtt7zSE GKMQhLWzbwoBwHappDIazR8daHxivtw7unaaVZGehIHcOqISjjRGP6davlGLqlB6hO qT3l8L2usslpJfqrLyj98hLSgps3r3ZFyGJcBnaUT6eqh9f9LAVhyCx6Kytds03Jo6 YZz7vlX6vcS5Q== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Hawkins Jiawei , syzbot+a3e6acd85ded5c16a709@syzkaller.appspotmail.com, Mike Kravetz , Muchun Song , Ian Kent , Andrew Morton , Sasha Levin , muchun.song@linux.dev, linux-mm@kvack.org Subject: [PATCH AUTOSEL 5.10 1/5] hugetlbfs: fix null-ptr-deref in hugetlbfs_parse_param() Date: Mon, 19 Dec 2022 20:22:14 -0500 Message-Id: <20221220012218.1222657-1-sashal@kernel.org> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 2CB83C0006 X-Rspamd-Server: rspam09 X-Rspam-User: X-Stat-Signature: onwty73a87njdq8jryo66imrhopdc5ke X-HE-Tag: 1671499344-824375 X-HE-Meta: U2FsdGVkX1/P+mzUE/0ikHVvCN2u9VwRULS16jAdPn9b8npCqGRJLL0czfB/xJRQ/7sUKhnVymJC9wVL3CYXFsNltVCN5ipXGTMRED6GgJF/LzroZNOC7IgvJ14DM3Myq7SUzqWe1XLMsFsld6pWfuVam4fsdVw6cpYvr1aRRwGZKr2fSGwdBQ5G8AjMoAJ9ObXv6N7vpjb+KAXqRTBOirftxrZXhWY3YU+EtpMx4S4DSg4lJYdTQFT8uJRhCvkBsDSO2ENAH0OEOXxOhc8BiewGx3P8epKKw8QeI9pyQx4hGxYxry4e2MKWqWQFbpE5zsaxBVihO4gW6kTRX5BevU3LJO8T2Vxn6jLSmiGfeELGF6yD7DJvyMCfjcbLz2d67G9/KvbCwF53KAqTPHtXh68tM+3B52Ke6Up2GKAZB6cjZ9uRR8xUCTFtH6Qs2P1pIET0dD7WthB9f5W4meB9PzeHe3cvubG+GDQrTGYrYKhqVIfNFDaz+N0Ibv1bAVSVHk0v5ZgNfMdVG2Gtou/eSjD6pnQJ22Xjp4Fyh4dIYQEq1ShONKsu29L1RGVYMaK7d0wZqEQz9q6h3263MAJsu2D+iJi+aVZ8iHJilG6kx05BatJJzF8IH5X4WNfxLAVJU/eUgDCXVd6E7NC017JMZarilx0Ur37hfwuCMC2N5s8+IkHlNsZ/lrbqQKpktO7sZJd+tTd8mtPXSXrfyYixJX+lX0EmpbscDFlOesMdEJ2qa1rO43+tjBRiNd+ZnCY+P6CqnrTwL4pmj9+0tP+3haeqb3Ikfa8b2s6Nw769EVD2bNtRNsIi2nAfY/lsoRZvrmVhGdOX4/Xl7NSi6pDQ+MduPFUtNzKn4XzGaBkobPLzyVLSQ+R30rydfDO4pPQEwbZ6ETeULzXL6QfAxXCPQdqVfojAqFj0LQP2zGtUGLMNQtdr8tsyVw+twUAy03d/UsicEupGPIdkryXMlb/ 7s77ADkK Po9DgUC9jaB3qk5qWeaX7n7mV/NpVfX7xVagQdotkE1910L7wMmgrROLZxP2WcL5TixfDX7dRt9dWn1Sb2+goymS9Qto5SAIg0S0t7dOdBsctvTa3QTfQI4ReHH9hTko4Ue4Z4dVMX9lXH2OJpEabY3/tBJsxVDgC4chE0VlNXgMNiJcdkbqjxSdGYuQsPGx1CTCPlt+u15qc5MsjknsGcscQ6Q== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Hawkins Jiawei [ Upstream commit 26215b7ee923b9251f7bb12c4e5f09dc465d35f2 ] Syzkaller reports a null-ptr-deref bug as follows: ====================================================== KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] RIP: 0010:hugetlbfs_parse_param+0x1dd/0x8e0 fs/hugetlbfs/inode.c:1380 [...] Call Trace: vfs_parse_fs_param fs/fs_context.c:148 [inline] vfs_parse_fs_param+0x1f9/0x3c0 fs/fs_context.c:129 vfs_parse_fs_string+0xdb/0x170 fs/fs_context.c:191 generic_parse_monolithic+0x16f/0x1f0 fs/fs_context.c:231 do_new_mount fs/namespace.c:3036 [inline] path_mount+0x12de/0x1e20 fs/namespace.c:3370 do_mount fs/namespace.c:3383 [inline] __do_sys_mount fs/namespace.c:3591 [inline] __se_sys_mount fs/namespace.c:3568 [inline] __x64_sys_mount+0x27f/0x300 fs/namespace.c:3568 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd [...] ====================================================== According to commit "vfs: parse: deal with zero length string value", kernel will set the param->string to null pointer in vfs_parse_fs_string() if fs string has zero length. Yet the problem is that, hugetlbfs_parse_param() will dereference the param->string, without checking whether it is a null pointer. To be more specific, if hugetlbfs_parse_param() parses an illegal mount parameter, such as "size=,", kernel will constructs struct fs_parameter with null pointer in vfs_parse_fs_string(), then passes this struct fs_parameter to hugetlbfs_parse_param(), which triggers the above null-ptr-deref bug. This patch solves it by adding sanity check on param->string in hugetlbfs_parse_param(). Link: https://lkml.kernel.org/r/20221020231609.4810-1-yin31149@gmail.com Reported-by: syzbot+a3e6acd85ded5c16a709@syzkaller.appspotmail.com Tested-by: syzbot+a3e6acd85ded5c16a709@syzkaller.appspotmail.com Link: https://lore.kernel.org/all/0000000000005ad00405eb7148c6@google.com/ Signed-off-by: Hawkins Jiawei Reviewed-by: Mike Kravetz Cc: Hawkins Jiawei Cc: Muchun Song Cc: Ian Kent Signed-off-by: Andrew Morton Signed-off-by: Sasha Levin --- fs/hugetlbfs/inode.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index a2f43f1a85f8..5181e6d4e18c 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -1261,7 +1261,7 @@ static int hugetlbfs_parse_param(struct fs_context *fc, struct fs_parameter *par case Opt_size: /* memparse() will accept a K/M/G without a digit */ - if (!isdigit(param->string[0])) + if (!param->string || !isdigit(param->string[0])) goto bad_val; ctx->max_size_opt = memparse(param->string, &rest); ctx->max_val_type = SIZE_STD; @@ -1271,7 +1271,7 @@ static int hugetlbfs_parse_param(struct fs_context *fc, struct fs_parameter *par case Opt_nr_inodes: /* memparse() will accept a K/M/G without a digit */ - if (!isdigit(param->string[0])) + if (!param->string || !isdigit(param->string[0])) goto bad_val; ctx->nr_inodes = memparse(param->string, &rest); return 0; @@ -1287,7 +1287,7 @@ static int hugetlbfs_parse_param(struct fs_context *fc, struct fs_parameter *par case Opt_min_size: /* memparse() will accept a K/M/G without a digit */ - if (!isdigit(param->string[0])) + if (!param->string || !isdigit(param->string[0])) goto bad_val; ctx->min_size_opt = memparse(param->string, &rest); ctx->min_val_type = SIZE_STD; -- 2.35.1