From: Li Guifu <bluce.ligu...@huawei.com> memory allocation failure should be handled properly in principle.
Signed-off-by: Li Guifu <bluce.ligu...@huawei.com> [ Gao Xiang: due to Huawei outgoing email limitation, I have to help Guifu send out his patches at work. ] Signed-off-by: Gao Xiang <gaoxian...@huawei.com> --- lib/inode.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/inode.c b/lib/inode.c index 86c465ee2f78..620db60f4a5b 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -264,6 +264,8 @@ int erofs_write_dir_file(struct erofs_inode *dir) if (used) { /* fill tail-end dir block */ dir->idata = malloc(used); + if (!dir->idata) + return -ENOMEM; DBG_BUGON(used != dir->idata_size); fill_dirblock(dir->idata, dir->idata_size, q, head, d); } @@ -286,6 +288,8 @@ int erofs_write_file_from_buffer(struct erofs_inode *inode, char *buf) inode->idata_size = inode->i_size % EROFS_BLKSIZ; if (inode->idata_size) { inode->idata = malloc(inode->idata_size); + if (!inode->idata) + return -ENOMEM; memcpy(inode->idata, buf + blknr_to_addr(nblocks), inode->idata_size); } @@ -347,9 +351,12 @@ int erofs_write_file(struct erofs_inode *inode) inode->idata_size = inode->i_size % EROFS_BLKSIZ; if (inode->idata_size) { inode->idata = malloc(inode->idata_size); + if (!inode->idata) + return -ENOMEM; ret = read(fd, inode->idata, inode->idata_size); if (ret < inode->idata_size) { + free(inode->idata); close(fd); return -EIO; } @@ -825,12 +832,18 @@ struct erofs_inode *erofs_mkfs_build_tree(struct erofs_inode *dir) if (S_ISLNK(dir->i_mode)) { char *const symlink = malloc(dir->i_size); + if (!symlink) + return ERR_PTR(-ENOMEM); ret = readlink(dir->i_srcpath, symlink, dir->i_size); - if (ret < 0) + if (ret < 0) { + free(symlink); return ERR_PTR(-errno); + } - erofs_write_file_from_buffer(dir, symlink); + ret = erofs_write_file_from_buffer(dir, symlink); free(symlink); + if (ret) + return ERR_PTR(ret); } else { erofs_write_file(dir); } -- 2.17.1