[U-Boot] [PATCH 2/3] ext4: propagate error if creation of directory entry fails

Lukasz Majewski l.majewski at samsung.com
Thu Aug 18 16:45:58 CEST 2016


Hi Stefan,

> In case the dir entry creation failed, ext4fs_write would later
> overwrite a random inode, as inodeno was never initialized.
> 
> Signed-off-by: Stefan Brüns <stefan.bruens at rwth-aachen.de>
> ---
>  fs/ext4/ext4_common.c | 12 ++++++------
>  fs/ext4/ext4_common.h |  2 +-
>  fs/ext4/ext4_write.c  |  4 +++-
>  3 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c
> index 3ecd9a8..b8c37cf 100644
> --- a/fs/ext4/ext4_common.c
> +++ b/fs/ext4/ext4_common.c
> @@ -344,7 +344,7 @@ static int check_void_in_dentry(struct
> ext2_dirent *dir, char *filename) return 0;
>  }
>  
> -void ext4fs_update_parent_dentry(char *filename, int *p_ino, int
> file_type) +int ext4fs_update_parent_dentry(char *filename, int
> file_type) {
>  	unsigned int *zero_buffer = NULL;
>  	char *root_first_block_buffer = NULL;
> @@ -358,7 +358,7 @@ void ext4fs_update_parent_dentry(char *filename,
> int *p_ino, int file_type) unsigned int last_entry_dirlen;
>  	int sizeof_void_space = 0;
>  	int templength = 0;
> -	int inodeno;
> +	int inodeno = -1;
>  	int status;
>  	struct ext_filesystem *fs = get_fs();
>  	/* directory entry */
> @@ -371,13 +371,13 @@ void ext4fs_update_parent_dentry(char
> *filename, int *p_ino, int file_type) zero_buffer = zalloc(fs->blksz);
>  	if (!zero_buffer) {
>  		printf("No Memory\n");
> -		return;
> +		return -1;
>  	}
>  	root_first_block_buffer = zalloc(fs->blksz);
>  	if (!root_first_block_buffer) {
>  		free(zero_buffer);
>  		printf("No Memory\n");
> -		return;
> +		return -1;
>  	}
>  restart:
>  
> @@ -496,8 +496,6 @@ restart:
>  	temp_dir = temp_dir + sizeof(struct ext2_dirent);
>  	memcpy(temp_dir, filename, strlen(filename));
>  
> -	*p_ino = inodeno;
> -
>  	/* update or write  the 1st block of root inode */
>  	if (ext4fs_put_metadata(root_first_block_buffer,
>  				first_block_no_of_root))
> @@ -506,6 +504,8 @@ restart:
>  fail:
>  	free(zero_buffer);
>  	free(root_first_block_buffer);
> +
> +	return inodeno;
>  }
>  
>  static int search_dir(struct ext2_inode *parent_inode, char *dirname)
> diff --git a/fs/ext4/ext4_common.h b/fs/ext4/ext4_common.h
> index 370a717..cc9d0c5 100644
> --- a/fs/ext4/ext4_common.h
> +++ b/fs/ext4/ext4_common.h
> @@ -61,7 +61,7 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir,
> char *name, uint32_t ext4fs_div_roundup(uint32_t size, uint32_t n);
>  uint16_t ext4fs_checksum_update(unsigned int i);
>  int ext4fs_get_parent_inode_num(const char *dirname, char *dname,
> int flags); -void ext4fs_update_parent_dentry(char *filename, int
> *p_ino, int file_type); +int ext4fs_update_parent_dentry(char
> *filename, int file_type); uint32_t ext4fs_get_new_blk_no(void);
>  int ext4fs_get_new_inode_no(void);
>  void ext4fs_reset_block_bmap(long int blockno, unsigned char *buffer,
> diff --git a/fs/ext4/ext4_write.c b/fs/ext4/ext4_write.c
> index f5811aa..4235b95 100644
> --- a/fs/ext4/ext4_write.c
> +++ b/fs/ext4/ext4_write.c
> @@ -890,7 +890,9 @@ int ext4fs_write(const char *fname, unsigned char
> *buffer, goto fail;
>  	}
>  
> -	ext4fs_update_parent_dentry(filename, &inodeno,
> FILETYPE_REG);
> +	inodeno = ext4fs_update_parent_dentry(filename,
> FILETYPE_REG);
> +	if (inodeno == -1)
> +		goto fail;
>  	/* prepare file inode */
>  	inode_buffer = zalloc(fs->inodesz);
>  	if (!inode_buffer)

Reviewed-by: Lukasz Majewski <l.majewski at samsung.com>

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group


More information about the U-Boot mailing list