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.bru...@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.majew...@samsung.com> -- Best regards, Lukasz Majewski Samsung R&D Institute Poland (SRPOL) | Linux Platform Group _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot