ext4: propagate error if creation of directory entry fails
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@rwth-aachen.de> Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
This commit is contained in:
parent
76a29519ff
commit
a0d767e2c1
@ -366,7 +366,7 @@ static int check_void_in_dentry(struct ext2_dirent *dir, char *filename)
|
|||||||
return 0;
|
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;
|
unsigned int *zero_buffer = NULL;
|
||||||
char *root_first_block_buffer = NULL;
|
char *root_first_block_buffer = NULL;
|
||||||
@ -380,7 +380,7 @@ void ext4fs_update_parent_dentry(char *filename, int *p_ino, int file_type)
|
|||||||
unsigned int last_entry_dirlen;
|
unsigned int last_entry_dirlen;
|
||||||
int sizeof_void_space = 0;
|
int sizeof_void_space = 0;
|
||||||
int templength = 0;
|
int templength = 0;
|
||||||
int inodeno;
|
int inodeno = -1;
|
||||||
int status;
|
int status;
|
||||||
struct ext_filesystem *fs = get_fs();
|
struct ext_filesystem *fs = get_fs();
|
||||||
/* directory entry */
|
/* directory entry */
|
||||||
@ -393,13 +393,13 @@ void ext4fs_update_parent_dentry(char *filename, int *p_ino, int file_type)
|
|||||||
zero_buffer = zalloc(fs->blksz);
|
zero_buffer = zalloc(fs->blksz);
|
||||||
if (!zero_buffer) {
|
if (!zero_buffer) {
|
||||||
printf("No Memory\n");
|
printf("No Memory\n");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
root_first_block_buffer = zalloc(fs->blksz);
|
root_first_block_buffer = zalloc(fs->blksz);
|
||||||
if (!root_first_block_buffer) {
|
if (!root_first_block_buffer) {
|
||||||
free(zero_buffer);
|
free(zero_buffer);
|
||||||
printf("No Memory\n");
|
printf("No Memory\n");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
restart:
|
restart:
|
||||||
|
|
||||||
@ -518,8 +518,6 @@ restart:
|
|||||||
temp_dir = temp_dir + sizeof(struct ext2_dirent);
|
temp_dir = temp_dir + sizeof(struct ext2_dirent);
|
||||||
memcpy(temp_dir, filename, strlen(filename));
|
memcpy(temp_dir, filename, strlen(filename));
|
||||||
|
|
||||||
*p_ino = inodeno;
|
|
||||||
|
|
||||||
/* update or write the 1st block of root inode */
|
/* update or write the 1st block of root inode */
|
||||||
if (ext4fs_put_metadata(root_first_block_buffer,
|
if (ext4fs_put_metadata(root_first_block_buffer,
|
||||||
first_block_no_of_root))
|
first_block_no_of_root))
|
||||||
@ -528,6 +526,8 @@ restart:
|
|||||||
fail:
|
fail:
|
||||||
free(zero_buffer);
|
free(zero_buffer);
|
||||||
free(root_first_block_buffer);
|
free(root_first_block_buffer);
|
||||||
|
|
||||||
|
return inodeno;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int search_dir(struct ext2_inode *parent_inode, char *dirname)
|
static int search_dir(struct ext2_inode *parent_inode, char *dirname)
|
||||||
|
@ -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);
|
uint32_t ext4fs_div_roundup(uint32_t size, uint32_t n);
|
||||||
uint16_t ext4fs_checksum_update(unsigned int i);
|
uint16_t ext4fs_checksum_update(unsigned int i);
|
||||||
int ext4fs_get_parent_inode_num(const char *dirname, char *dname, int flags);
|
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);
|
uint32_t ext4fs_get_new_blk_no(void);
|
||||||
int ext4fs_get_new_inode_no(void);
|
int ext4fs_get_new_inode_no(void);
|
||||||
void ext4fs_reset_block_bmap(long int blockno, unsigned char *buffer,
|
void ext4fs_reset_block_bmap(long int blockno, unsigned char *buffer,
|
||||||
|
@ -907,7 +907,9 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
|
|||||||
goto fail;
|
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 */
|
/* prepare file inode */
|
||||||
inode_buffer = zalloc(fs->inodesz);
|
inode_buffer = zalloc(fs->inodesz);
|
||||||
if (!inode_buffer)
|
if (!inode_buffer)
|
||||||
|
Loading…
Reference in New Issue
Block a user