[PATCH 3/5] ubifs: reject master nodes claiming a too small inode number

Zhihao Cheng chengzhihao1 at huawei.com
Mon Nov 2 18:06:12 PST 2026


在 2026/11/2 21:49, shao.mingyin at zte.com.cn 写道:
> validate_master() only rejects highest_inum values above
> INUM_WATERMARK.  A master node whose value is below UBIFS_FIRST_INO is
> accepted, and ubifs_new_inode() then allocates inode numbers starting
> from that value, i.e. from the range reserved for special inodes.  With
> highest_inum = 0 the very first new inode gets number 1, which is
> UBIFS_ROOT_INO and is already used by the root inode, so two inodes end
> up with the same number and the index is corrupted.
> 
> Check the lower bound as well.
> 
> Fixes: 1e51764a3c2a ("UBIFS: add new flash file system")
> Cc: stable at vger.kernel.org
> Signed-off-by: Shao Mingyin <shao.mingyin at zte.com.cn>
> ---
> diff --git a/fs/ubifs/master.c b/fs/ubifs/master.c
> index a148760fa49e..8a1ba81c10bb 100644
> --- a/fs/ubifs/master.c
> +++ b/fs/ubifs/master.c
> @@ -191,6 +191,16 @@ static int validate_master(const struct ubifs_info *c)
>   		goto out;
>   	}
>   
> +	/*
> +	 * Inode numbers below UBIFS_FIRST_INO are reserved.  If the master
> +	 * node claims a smaller value, newly created inodes would reuse the
> +	 * root inode number or another reserved one.
> +	 */
> +	if (c->highest_inum < UBIFS_FIRST_INO) {
> +		err = 24;
> +		goto out;
> +	}
> +

This check could be merged into previous check:
  f (c->highest_inum >= INUM_WATERMARK)
>   	if (c->lhead_lnum < UBIFS_LOG_LNUM ||
>   	    c->lhead_lnum >= UBIFS_LOG_LNUM + c->log_lebs ||
>   	    c->lhead_offs < 0 || c->lhead_offs >= c->leb_size ||
> .
> 




More information about the linux-mtd mailing list