Received: by 2002:a05:6358:1087:b0:cb:c9d3:cd90 with SMTP id j7csp2632487rwi; Sat, 15 Oct 2022 18:40:25 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5xTR26rOF/Zdd/WMvvo6vrIuH/KLZDhD+191b6Hbrd5a6JeSeKikZW9bd8KYzM9IUkNnkc X-Received: by 2002:a63:6f8a:0:b0:439:36bc:89f9 with SMTP id k132-20020a636f8a000000b0043936bc89f9mr4716265pgc.100.1665884425651; Sat, 15 Oct 2022 18:40:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665884425; cv=none; d=google.com; s=arc-20160816; b=bZDk8LXlakwGQCBNJoEa2M9VVJx4cMgQZkFXw773vEb+3s5E+HPiJCZ5wyz0C4HDXP ynGtN6qpvvcSJFN2RuIqN8k9uZbivN16dXsyYU1hNfXXWI3ycytelzYbbmBEa7v5ZE6H GEzIr8DNlz6gfX8qLBJkzyzb2iBWUrVAZyAJ7wSiXHuojLmzpsh6Fi0tRKK+XTIBcj85 OmXj/v6yg08gvl1Qf6EXep5layvy7Z+E8jAU+tijJceqvBsJhSKIHhNDgg1pRvOCScT2 TEXKKfIQuWezg6eOH6Knmby0ck5lt9TfpMjioLbFfnFLOslf11Bo0VkVU2m+Pg1yCC2s zVsQ== 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 :message-id:date:subject:cc:to:from; bh=FkId9yarYhzeiiuwzFT/xm54VIGGYRJwD7FF3rC+H2U=; b=k5meTrVlRCNz+vLmWNeFaBApYxXt6bG+Ud6zrzn6vLEF8/xzXIa6s0ihTG2COh5KMZ 4rWyLPsgwddTrrWxRrRs1ai7U3TnhyC2UrEAMC49sxfwVpMtXEVi1qyCf7LQTrDrYc+k DH5ByHO2lTyOJyJPYD7SAEt1gblB1Wpbi59shO0LBGNC0gP5bWNPD3foNC2f5pM3TA70 NMrZsQcRRyRdh7uAj/4Dei3iTpIbcSHUj65P8Hrbfv/AGxa7z8e6xNLEWZzd+JXy4yT1 fZe7rf7u3VrHx4p++TIpVIn4Oa7JKzR2VkBC+fpGN/KBc1GM3Df5TI5VkqhumZawRssu 5IIg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id n26-20020a63971a000000b0043c2e57961asi7522001pge.799.2022.10.15.18.39.54; Sat, 15 Oct 2022 18:40:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229648AbiJPB1l (ORCPT + 99 others); Sat, 15 Oct 2022 21:27:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36050 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229463AbiJPB1k (ORCPT ); Sat, 15 Oct 2022 21:27:40 -0400 Received: from hust.edu.cn (unknown [202.114.0.240]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2FB2441D1D for ; Sat, 15 Oct 2022 18:27:38 -0700 (PDT) Received: from localhost.localdomain ([172.16.0.254]) (user=dzm91@hust.edu.cn mech=LOGIN bits=0) by mx1.hust.edu.cn with ESMTP id 29G1QjHL004769-29G1QjHO004769 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sun, 16 Oct 2022 09:26:50 +0800 From: Dongliang Mu To: Dave Kleikamp Cc: Dongliang Mu , syzbot+15342c1aa6a00fb7a438@syzkaller.appspotmail.com, jfs-discussion@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH v2] fs: jfs: fix shift-out-of-bounds in dbAllocAG Date: Sun, 16 Oct 2022 09:25:07 +0800 Message-Id: <20221016012507.428006-1-dzm91@hust.edu.cn> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-FEAS-AUTH-USER: dzm91@hust.edu.cn X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dongliang Mu Syzbot found a crash : UBSAN: shift-out-of-bounds in dbAllocAG. The underlying bug is the missing check of bmp->db_agl2size. The field can be greater than 64 and trigger the shift-out-of-bounds. Fix this bug by adding a check of bmp->db_agl2size in dbMount since this field is used in many following functions. The upper bound for this field is MAXMAPSIZE - L2MAXAG, thanks for the help of Dave Kleikamp. Notethat, for maintainance, I reorganzie error handling code of dbMount. Reported-by: syzbot+15342c1aa6a00fb7a438@syzkaller.appspotmail.com Signed-off-by: Dongliang Mu --- v1->2: fix the size of bmp->db_agl2size; revise the correct upper bound fs/jfs/jfs_dmap.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index 6b838d3ae7c2..962c855631cb 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c @@ -155,7 +155,7 @@ int dbMount(struct inode *ipbmap) struct bmap *bmp; struct dbmap_disk *dbmp_le; struct metapage *mp; - int i; + int i, err; /* * allocate/initialize the in-memory bmap descriptor @@ -170,8 +170,8 @@ int dbMount(struct inode *ipbmap) BMAPBLKNO << JFS_SBI(ipbmap->i_sb)->l2nbperpage, PSIZE, 0); if (mp == NULL) { - kfree(bmp); - return -EIO; + err = -EIO; + goto err_kfree_bmp; } /* copy the on-disk bmap descriptor to its in-memory version. */ @@ -181,9 +181,8 @@ int dbMount(struct inode *ipbmap) bmp->db_l2nbperpage = le32_to_cpu(dbmp_le->dn_l2nbperpage); bmp->db_numag = le32_to_cpu(dbmp_le->dn_numag); if (!bmp->db_numag) { - release_metapage(mp); - kfree(bmp); - return -EINVAL; + err = -EINVAL; + goto err_release_metapage; } bmp->db_maxlevel = le32_to_cpu(dbmp_le->dn_maxlevel); @@ -194,6 +193,11 @@ int dbMount(struct inode *ipbmap) bmp->db_agwidth = le32_to_cpu(dbmp_le->dn_agwidth); bmp->db_agstart = le32_to_cpu(dbmp_le->dn_agstart); bmp->db_agl2size = le32_to_cpu(dbmp_le->dn_agl2size); + if (bmp->db_agl2size > MAXMAPSIZE - L2MAXAG) { + err = -EINVAL; + goto err_release_metapage; + } + for (i = 0; i < MAXAG; i++) bmp->db_agfree[i] = le64_to_cpu(dbmp_le->dn_agfree[i]); bmp->db_agsize = le64_to_cpu(dbmp_le->dn_agsize); @@ -214,6 +218,12 @@ int dbMount(struct inode *ipbmap) BMAP_LOCK_INIT(bmp); return (0); + +err_release_metapage: + release_metapage(mp); +err_kfree_bmp: + kfree(bmp); + return err; } -- 2.35.1