From nobody Fri Oct 2 08:28:42 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C0ED0371049 for ; Mon, 3 Aug 2026 11:42:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785757323; cv=none; b=F8xlkB3v+xTgk/feYsil28lxW4bKgIMNXTRJOd5AAHIonqGlKhblO4mag5CnUzRJJZ8Cqa+KLUgEWWYt/AEg7uEeBFi6jFHqSFkcCUJfr32VZ/MwbJ0Eyt5ZUQoJIiNS7vWAsRoChnWT8qZQ+cmYSibrRaGDsZVVzFIm8RiJvJo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785757323; c=relaxed/simple; bh=bsU/ZtciHD0o5gGQG6pZknzLMSFzmzrb5jxgjgxzaJk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=qZsPLRrIdmi9wyJ0+h/8nGMBkiaR8jyw9ocQeOEjN+4MZtU007HG6je4GP6rK323fe7mI2ImL+VjLcLYqHxFZjapTrP1xEHQPuIDk4Ezq2sNa1tj80+lTeBmz7qDeO129Cal4oy9Bs7Xb9t5iGp6CVRBPTErEdEynV2rjDOs40s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cIpzvUQ0; arc=none smtp.client-ip=209.85.210.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cIpzvUQ0" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-84864086bfeso3411958b3a.1 for ; Mon, 03 Aug 2026 04:42:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785757321; x=1786362121; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=66TqE0GY70NfftLhEOihtiNKAYH2cWMQlF34dt0hI5Q=; b=cIpzvUQ0LOmBRwuuHAVlMzEk8hX0sr+P3TIFtcNNEYz57pcUbJInaHZ8ckfp4tdCH5 V5Gd1kXqIWD6WcF92MuD3sXFCbk3lqROb7KQXiIW4WH8osR3bzq2kvAqcZOwGSp1zplR to+GdVDYITdTWX7ksBYAuWQ3YoNboKYUWmpmlWKyRzA0OwPJ5OPd46uDvnL2bVRWa0sF DwrRusV7RakrPCJmqc5JprIohzP8BMGMGBfQ2sIPeuhvteAmCRdeyQ2e6LM8qiR9jVFS tSWApUBwq1C4GicOldGLyy9nbO+7hp5E8cJ6DVUXFdajyhh34apldRcjunrkTm+saFWJ w5uA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785757321; x=1786362121; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=66TqE0GY70NfftLhEOihtiNKAYH2cWMQlF34dt0hI5Q=; b=lsMQ+2KeajJy43AHcrLplLamKnU5hAft8J3ph5C7GzNHNPROz8UCnWsCEA4mqVA5ed 8GpuPDxHRsexEsKTHtB+eQgs7gd3lWaZiJJYhJxKgSXzjpBSn/QRI3mq0fKOpBWgJK1t zW/tR1KVRSiGI1yOLyXH4zvtTTqTci5B9qkeR4IRUas9STqHqm/AV175VVigIv1YKASP PlKVf2DfSwHPMkUykA0nEzbyE4bapDV892ohsMPOBA+xNISrTZEe65WtcpVLPYuFLGeV Wy3yW0g4U7BMC2UrgB96j/2DftqrOHifEgXRpaef8CRZlobIa68OZMQyIlXcjk/NyDVp q7ag== X-Forwarded-Encrypted: i=1; AHgh+RrZTNgJZTXs5Tq7es6NPUYlYiTJByNv8w7ltlGGCKBqrZqvRLFiOUjjF+dcReIOecT4/cuLM0Lp8SZqV/U=@vger.kernel.org X-Gm-Message-State: AOJu0YwS8eEajS9YXA7wOlQrx1Zxntw7mAkC5sQLrttbnp1NZ+Zhf2iG WLjj3fj6IiN5xDgUcSGSJZiN771sQC5MTsNFl6wd0KRf8XHkS7D6RLKM X-Gm-Gg: AR+sD11k94jhItfTvhNTnoQ9FxlGl6aSAyTt1rL4ibh1a5UDFcVVb/7Z9gjXYjXlje8 nHEBdTGrWj0ivUkAzrUp00BO9cur6kdHZ4hfxsCx2f4+djMWdCOAYTFfFrShW6MfY8NeDCp7qSL cTc9x4uMtXfSZWR1syGcF0P7pM5GFeQtMgIMin0Y5Fo4VEdEmTegfq1LaDmjVq9zMNyl1/x3qFx bmxj9TjY49qiHbGQfaG2aqoKOXdXln7O6B1vlH705EvY/me7MtJqmI9Q4GQGLmswV02+eJFskhd tyqxt6FfuL3B2AThM7qaA2ZbbK/LSl6lvdaIq0thZ3rrBaQeZcsJ6lqpYWlROCmTmVnsQnRaFiP oHRi1jJD3R7UjoGGFjnXCQ+F2oXamppAnhbl/oLzQ7uJFJrFBHyPDQ0n2CiFUG2Wz2sXdJ8iC3M YdLTML4azIFhbZoFSZ1oH62H2Qe3V9siGO1ySLkpEi6ybGdjjurkmS1QnBY5ZrDxWSYpuji6y7d fXjwwjav/wUzcsfzJOG1Uet X-Received: by 2002:a05:6a00:1706:b0:84e:2bb:2d39 with SMTP id d2e1a72fcca58-84ee48ff5e9mr8105452b3a.53.1785757320924; Mon, 03 Aug 2026 04:42:00 -0700 (PDT) Received: from qiwenjie-ThinkCentre-M760t.mioffice.cn ([43.224.245.241]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84edbd36eb1sm3640620b3a.11.2026.08.03.04.41.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Aug 2026 04:42:00 -0700 (PDT) From: Wenjie Qi X-Google-Original-From: Wenjie Qi To: jaegeuk@kernel.org, chao@kernel.org Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org, qiwenjie@xiaomi.com, qwjhust@gmail.com Subject: [PATCH v2] f2fs: reject invalid recovered filename lengths Date: Mon, 3 Aug 2026 19:41:53 +0800 Message-ID: <20260803114153.1499527-1-qiwenjie@xiaomi.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Recovery uses raw_inode->i_namelen directly when rebuilding fsynced dentries. A zero-length name uses no dentry slots, so recovery can report success without recreating the dentry. Treat zero-length and oversized recovered names as corruption, mark NEED_FSCK, and stop recovery with -EFSCORRUPTED. Signed-off-by: Wenjie Qi Reviewed-by: Chao Yu --- v2: - add unlikely() to the invalid recovered filename length check - move the invalid-length corruption handling into init_recovered_filename() fs/f2fs/recovery.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index 89af8407b667..268b00536869 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -116,18 +116,26 @@ static void del_fsync_inode(struct fsync_inode_entry = *entry, int drop) } =20 static int init_recovered_filename(const struct inode *dir, + struct inode *inode, struct f2fs_inode *raw_inode, struct f2fs_filename *fname, struct qstr *usr_fname) { + struct f2fs_sb_info *sbi =3D F2FS_I_SB(inode); int err; =20 memset(fname, 0, sizeof(*fname)); fname->disk_name.len =3D le32_to_cpu(raw_inode->i_namelen); fname->disk_name.name =3D raw_inode->i_name; =20 - if (WARN_ON(fname->disk_name.len > F2FS_NAME_LEN)) - return -ENAMETOOLONG; + if (unlikely(!fname->disk_name.len || + fname->disk_name.len > F2FS_NAME_LEN)) { + f2fs_err(sbi, "invalid recovered filename length %u for ino %llu", + fname->disk_name.len, inode->i_ino); + set_sbi_flag(sbi, SBI_NEED_FSCK); + f2fs_handle_error(sbi, ERROR_CORRUPTED_INODE); + return -EFSCORRUPTED; + } =20 if (!IS_ENCRYPTED(dir)) { usr_fname->name =3D fname->disk_name.name; @@ -184,7 +192,7 @@ static int recover_dentry(struct inode *inode, struct f= olio *ifolio, } =20 dir =3D entry->inode; - err =3D init_recovered_filename(dir, raw_inode, &fname, &usr_fname); + err =3D init_recovered_filename(dir, inode, raw_inode, &fname, &usr_fname= ); if (err) goto out; retry: --=20 2.43.0