Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp520814yba; Mon, 1 Apr 2019 10:58:51 -0700 (PDT) X-Google-Smtp-Source: APXvYqybITqVKM/9C7QmGPwdzJdyk36eSl1lMyYuJtB8SuiC0AQb45+LXjdcpCOIc8xNynpdJst1 X-Received: by 2002:a63:e653:: with SMTP id p19mr552068pgj.284.1554141531434; Mon, 01 Apr 2019 10:58:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554141531; cv=none; d=google.com; s=arc-20160816; b=timnvVuEmzn7GhIFgmY+CiI5qsvclMi5qryaz6Ry86I5pL8cSIZ5HEUZTgbZ+RJ25R 6iSm65nhZgWn5ymc1B38B/bSC8wtXD6imRNONRJLRUs9f+lOD+VqtAQo+hl0ubbetNkR Tzcz5i9iMXz8aoFp9L3jENonT+JQnZgJlW6J5gFgDK6XcoMDT+zw54lHZzpN5r1NvFB8 rVnrrdIzvG2rNvzT5QBGV+m62cL5RxCerHvHsli58agcYQ4BfXTeiD9RcGV/7+f73OdZ KmPR3h8yoNgX/ZEldfIRT4MfFatbMhKyBbluddQ9nng5QWNqRZP1VtjCxCvki0Qq/to2 NDdw== 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=v4zwGUyo3Ftk3vDEk1VgeQuFR7K4Sm2SPseIYLC6kxk=; b=dCTcQv9pHtkQlVNsSnb16GQwO8JTBHX4YCiHMOrjFM8xmLb2tEOj8XIbiIPOCmePJN cZE6YYNuCBfiHteFfaMUYmQfWWWqPwxQAvk2NpgWSAuTWtrG9wyU5nr5fleXXnfHKZSp xQ0xnym1t3U8hqsfos5hDD1VCFbmLqftPVyE+g0IgcRAdtgus/umbfGbbggbCULG5qV0 H9SrTatpc1kl1t8c4ley0dkqxpGCfiOjk8O0Pnia5hb+kV1HYccp39VdAEU8jkr+1CWw bk3+SSfHuibu2mwYYq2ph7bmO6sX99yqxkUoFXjr2poFjNj6mqC5iQoJZuFuum5NMk3L BeTw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Xlhkn9+2; 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 f124si9155355pgc.596.2019.04.01.10.58.36; Mon, 01 Apr 2019 10:58:51 -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=Xlhkn9+2; 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 S1731232AbfDARTJ (ORCPT + 99 others); Mon, 1 Apr 2019 13:19:09 -0400 Received: from mail.kernel.org ([198.145.29.99]:46806 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731465AbfDARTG (ORCPT ); Mon, 1 Apr 2019 13:19:06 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 3D24820856; Mon, 1 Apr 2019 17:19:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554139144; bh=37XO1tZ4EBKxbbQh4zXHlDTaVqR/TwT0RWN+WN1B5Cg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Xlhkn9+2gWe3PW6+YlIs3Jyeo2qX4lnMds3prOfi2eQi56xOBjBH7UWXmPBLXP3Vv /xnNC6FblonjY3uK3QSBiueFs/6+Sxau0mNH2i/uT4GzkdHKVrpvdRUHysqHBU8fLV cV7qdXSqIk91mBXXrSPK6NGJXYTt83CilHysk74A= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Gao Xiang , Chao Yu Subject: [PATCH 4.19 127/134] staging: erofs: keep corrupted fs from crashing kernel in erofs_readdir() Date: Mon, 1 Apr 2019 19:02:43 +0200 Message-Id: <20190401170056.123220291@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190401170044.243719205@linuxfoundation.org> References: <20190401170044.243719205@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore 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 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ From: Gao Xiang commit 33bac912840fe64dbc15556302537dc6a17cac63 upstream. After commit 419d6efc50e9, kernel cannot be crashed in the namei path. However, corrupted nameoff can do harm in the process of readdir for scenerios without dm-verity as well. Fix it now. Fixes: 3aa8ec716e52 ("staging: erofs: add directory operations") Cc: # 4.19+ Signed-off-by: Gao Xiang Reviewed-by: Chao Yu Signed-off-by: Greg Kroah-Hartman --- drivers/staging/erofs/dir.c | 45 ++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) --- a/drivers/staging/erofs/dir.c +++ b/drivers/staging/erofs/dir.c @@ -23,6 +23,21 @@ static const unsigned char erofs_filetyp [EROFS_FT_SYMLINK] = DT_LNK, }; +static void debug_one_dentry(unsigned char d_type, const char *de_name, + unsigned int de_namelen) +{ +#ifdef CONFIG_EROFS_FS_DEBUG + /* since the on-disk name could not have the trailing '\0' */ + unsigned char dbg_namebuf[EROFS_NAME_LEN + 1]; + + memcpy(dbg_namebuf, de_name, de_namelen); + dbg_namebuf[de_namelen] = '\0'; + + debugln("found dirent %s de_len %u d_type %d", dbg_namebuf, + de_namelen, d_type); +#endif +} + static int erofs_fill_dentries(struct dir_context *ctx, void *dentry_blk, unsigned *ofs, unsigned nameoff, unsigned maxsize) @@ -33,14 +48,10 @@ static int erofs_fill_dentries(struct di de = dentry_blk + *ofs; while (de < end) { const char *de_name; - int de_namelen; + unsigned int de_namelen; unsigned char d_type; -#ifdef CONFIG_EROFS_FS_DEBUG - unsigned dbg_namelen; - unsigned char dbg_namebuf[EROFS_NAME_LEN]; -#endif - if (unlikely(de->file_type < EROFS_FT_MAX)) + if (de->file_type < EROFS_FT_MAX) d_type = erofs_filetype_table[de->file_type]; else d_type = DT_UNKNOWN; @@ -48,26 +59,20 @@ static int erofs_fill_dentries(struct di nameoff = le16_to_cpu(de->nameoff); de_name = (char *)dentry_blk + nameoff; - de_namelen = unlikely(de + 1 >= end) ? - /* last directory entry */ - strnlen(de_name, maxsize - nameoff) : - le16_to_cpu(de[1].nameoff) - nameoff; + /* the last dirent in the block? */ + if (de + 1 >= end) + de_namelen = strnlen(de_name, maxsize - nameoff); + else + de_namelen = le16_to_cpu(de[1].nameoff) - nameoff; /* a corrupted entry is found */ - if (unlikely(de_namelen < 0)) { + if (unlikely(nameoff + de_namelen > maxsize || + de_namelen > EROFS_NAME_LEN)) { DBG_BUGON(1); return -EIO; } -#ifdef CONFIG_EROFS_FS_DEBUG - dbg_namelen = min(EROFS_NAME_LEN - 1, de_namelen); - memcpy(dbg_namebuf, de_name, dbg_namelen); - dbg_namebuf[dbg_namelen] = '\0'; - - debugln("%s, found de_name %s de_len %d d_type %d", __func__, - dbg_namebuf, de_namelen, d_type); -#endif - + debug_one_dentry(d_type, de_name, de_namelen); if (!dir_emit(ctx, de_name, de_namelen, le64_to_cpu(de->nid), d_type)) /* stoped by some reason */