Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3976651pxf; Mon, 22 Mar 2021 22:23:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxygVUNlKKe4dQYeQz/wk8/EZZsEBCwt2oETqt3N+KvKSU8sk6HYkeD/V84PJrU1A5XDn6k X-Received: by 2002:a17:907:689:: with SMTP id wn9mr3054285ejb.485.1616476983914; Mon, 22 Mar 2021 22:23:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616476983; cv=none; d=google.com; s=arc-20160816; b=gYl4k9J42CqbDLLJFb/XtXcFuKp1avTDEILPXSAxo/APOD+K5amURqkQejPhybE0HU j6dskBo6DI2X+5Ov3jCWU1vIbGYJYIgCdRgR1N4oVIByDXJQfV1/z9MHVG8UQ7l3Bvf2 qXf+55gmrLjbEotiUXoYZQxyJzb0WTupq6f+rklJlJTvQJcliRxwBzT3lo+xKJtpIaXS tV9ReQwxqugLhxlLEfOGCzFFlu9FqoqyXckMTXSg9T6uAFmMBHGyPHvhLwKj0j45iCg8 BpHSZ8Lon98sv04SOV9VVrQwh/BeSm4+Sv576P/CPyaRT7evCXp5prsCiceY0lD2z1hm 9DOw== 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:dkim-signature; bh=TiZe8UTTgENquwib5uwcT0dF8caXTeaaWpOpfzenyxQ=; b=swRAA3e8GxbtC15RDNLxCRZqeBZ4nBhDXuNU9A4xa9dddtIspFqjYwIJ0Tsq9NRigV dBnTYMvHSFJaXfg/Olfs2NuUDW864bIuHBL9S+ECwr/IRya416dWcfURViq/rlf6dxNv KCZ0vKbMpay1yVkk4ybgR+A+p3q1AOZMotkNoCgJSvRpHJ7B6yAbP9ylf0MMSZTT6mCp Z5/KCs747ookmBE/gPRpU42xbH3RdjrQNca6aj8bQDCPaVy4Oeg6yJhd7qwOjl5G7DMJ pQ/Dycuz1mQurciCJ0SgF+GKMPcjkaKq1JDXGUQLQdkHg1sx19f1OAlW1p1lAsi98z35 2lEQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mail.ustc.edu.cn header.s=dkim header.b=KsD29ddw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mail.ustc.edu.cn Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ks7si12925553ejb.682.2021.03.22.22.22.31; Mon, 22 Mar 2021 22:23:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@mail.ustc.edu.cn header.s=dkim header.b=KsD29ddw; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=mail.ustc.edu.cn Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229493AbhCWFTM (ORCPT + 99 others); Tue, 23 Mar 2021 01:19:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43064 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229437AbhCWFSq (ORCPT ); Tue, 23 Mar 2021 01:18:46 -0400 Received: from ustc.edu.cn (email6.ustc.edu.cn [IPv6:2001:da8:d800::8]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 15A60C061574; Mon, 22 Mar 2021 22:18:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mail.ustc.edu.cn; s=dkim; h=Received:From:To:Cc:Subject:Date: Message-Id:MIME-Version:Content-Transfer-Encoding; bh=TiZe8UTTgE Nquwib5uwcT0dF8caXTeaaWpOpfzenyxQ=; b=KsD29ddwEse7OSbf2UQkcjoSee tKEVMEI5ImD0gAk1YrOHdjVS2vkaWMf29Q1Sns/daJqRRmwcB+cD/uA/Mb7Q9Jr4 pM3LSLle04E42SXglbeRefEHOMewww/5M3cHYxUwHWoeVyS8AohVUlKIt+oGtNNr XXXmck+lfNXhCCiWM= Received: from ubuntu.localdomain (unknown [202.38.69.14]) by newmailweb.ustc.edu.cn (Coremail) with SMTP id LkAmygC3vkoqellg6XEbAA--.456S4; Tue, 23 Mar 2021 13:18:34 +0800 (CST) From: Lv Yunlong To: vgoyal@redhat.com, stefanha@redhat.com, miklos@szeredi.hu Cc: virtualization@lists.linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Lv Yunlong Subject: [PATCH] fuse: Fix a potential double free in virtio_fs_get_tree Date: Mon, 22 Mar 2021 22:18:31 -0700 Message-Id: <20210323051831.13575-1-lyl2019@mail.ustc.edu.cn> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: LkAmygC3vkoqellg6XEbAA--.456S4 X-Coremail-Antispam: 1UD129KBjvJXoW7Kw1rGF48Ar1kCF1DArW8WFg_yoW8JFyrpr ykCr13Gr47Xry7Jas3CFnYg345K392kr1UGr92v343Cw4rJry0yrZ5Cry5Krs5ZrWxJFyr tF4rJr4agFWDCFJanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUvl14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j 6r4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oV Cq3wAac4AC62xK8xCEY4vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC 0VAKzVAqx4xG6I80ewAv7VC0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr 1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IE rcIFxwCY02Avz4vE14v_GrWl42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr 1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE 14v26r126r1DMIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7 IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWrZr1j6s0DMIIF0xvE x4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvj DU0xZFpf9x0JU94SOUUUUU= X-CM-SenderInfo: ho1ojiyrz6zt1loo32lwfovvfxof0/ Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In virtio_fs_get_tree, fm is allocated by kzalloc() and assigned to fsc->s_fs_info by fsc->s_fs_info=fm statement. If the kzalloc() failed, it will goto err directly, so that fsc->s_fs_info must be non-NULL and fm will be freed. But later fm is freed again when virtio_fs_fill_super() fialed. I think the statement if (fsc->s_fs_info) {kfree(fm);} is misplaced. My patch puts this statement in the correct palce to avoid double free. Signed-off-by: Lv Yunlong --- fs/fuse/virtio_fs.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c index 8868ac31a3c0..727cf436828f 100644 --- a/fs/fuse/virtio_fs.c +++ b/fs/fuse/virtio_fs.c @@ -1437,10 +1437,7 @@ static int virtio_fs_get_tree(struct fs_context *fsc) fsc->s_fs_info = fm; sb = sget_fc(fsc, virtio_fs_test_super, set_anon_super_fc); - if (fsc->s_fs_info) { - fuse_conn_put(fc); - kfree(fm); - } + if (IS_ERR(sb)) return PTR_ERR(sb); @@ -1457,6 +1454,11 @@ static int virtio_fs_get_tree(struct fs_context *fsc) sb->s_flags |= SB_ACTIVE; } + if (fsc->s_fs_info) { + fuse_conn_put(fc); + kfree(fm); + } + WARN_ON(fsc->root); fsc->root = dget(sb->s_root); return 0; -- 2.25.1