Sat Oct 25 00:06:58 1997 Theodore Ts'o <tytso@rsts-11.mit.edu>
+ * [all files, basically]: Added definition of ext2fs_get_mem,
+ ext2fs_free_mem, and ext2fs_resize_mem in ext2fs.h, and
+ changed all library routines to use these wrapper functions.
+
* dblist.c, mkdir.c: use EXT2_DIR_EXISTS and EXT2_DB_NOT_FOUND
instead of the system error messages.
char *buf = 0;
if (!block_buf) {
- buf = malloc(fs->blocksize);
- if (!buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buf);
+ if (retval)
+ return retval;
block_buf = buf;
}
memset(block_buf, 0, fs->blocksize);
fail:
if (buf)
- free(buf);
+ ext2fs_free_mem((void **) &buf);
return retval;
}
ext2_badblocks_list *ret)
{
ext2_badblocks_list bb;
+ errcode_t retval;
- bb = malloc(sizeof(struct ext2_struct_badblocks_list));
- if (!bb)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2_struct_badblocks_list),
+ (void **) &bb);
+ if (retval)
+ return retval;
memset(bb, 0, sizeof(struct ext2_struct_badblocks_list));
bb->magic = EXT2_ET_MAGIC_BADBLOCKS_LIST;
bb->size = size ? size : 10;
bb->num = num;
- bb->list = malloc(bb->size * sizeof(blk_t));
+ retval = ext2fs_get_mem(bb->size * sizeof(blk_t), (void **) &bb->list);
if (!bb->list) {
- free(bb);
- return EXT2_NO_MEMORY;
+ ext2fs_free_mem((void **) &bb);
+ return retval;
}
if (list)
memcpy(bb->list, list, bb->size * sizeof(blk_t));
*/
errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, blk_t blk)
{
- int i, j;
- blk_t *new_list;
+ errcode_t retval;
+ int i, j;
EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST);
if (bb->num >= bb->size) {
bb->size += 10;
- new_list = realloc(bb->list, bb->size * sizeof(blk_t));
- if (!new_list)
- return EXT2_NO_MEMORY;
- bb->list = new_list;
+ retval = ext2fs_resize_mem(bb->size * sizeof(blk_t),
+ (void **) &bb->list);
+ if (retval)
+ return retval;
}
j = bb->num;
ext2_badblocks_iterate *ret)
{
ext2_badblocks_iterate iter;
+ errcode_t retval;
EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST);
- iter = malloc(sizeof(struct ext2_struct_badblocks_iterate));
- if (!iter)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2_struct_badblocks_iterate),
+ (void **) &iter);
+ if (retval)
+ return retval;
iter->magic = EXT2_ET_MAGIC_BADBLOCKS_ITERATE;
iter->bb = bb;
return;
iter->bb = 0;
- free(iter);
+ ext2fs_free_mem((void **) &iter);
}
rec.bad_block_count = 0;
rec.ind_blocks_size = rec.ind_blocks_ptr = 0;
rec.max_ind_blocks = 10;
- rec.ind_blocks = malloc(rec.max_ind_blocks * sizeof(blk_t));
- if (!rec.ind_blocks)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(rec.max_ind_blocks * sizeof(blk_t),
+ (void **) &rec.ind_blocks);
+ if (retval)
+ return retval;
memset(rec.ind_blocks, 0, rec.max_ind_blocks * sizeof(blk_t));
- rec.block_buf = malloc(fs->blocksize);
- if (!rec.block_buf) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &rec.block_buf);
+ if (retval)
goto cleanup;
- }
memset(rec.block_buf, 0, fs->blocksize);
rec.err = 0;
goto cleanup;
cleanup:
- free(rec.ind_blocks);
- free(rec.block_buf);
+ ext2fs_free_mem((void **) &rec.ind_blocks);
+ ext2fs_free_mem((void **) &rec.block_buf);
return retval;
}
{
struct set_badblock_record *rec = (struct set_badblock_record *)
private;
- int group;
+ errcode_t retval;
+ int group;
if (!*block_nr)
return 0;
if (blockcnt < 0) {
if (rec->ind_blocks_size >= rec->max_ind_blocks) {
rec->max_ind_blocks += 10;
- rec->ind_blocks = realloc(rec->ind_blocks,
- rec->max_ind_blocks *
- sizeof(blk_t));
- if (!rec->ind_blocks) {
- rec->err = EXT2_NO_MEMORY;
+ retval = ext2fs_resize_mem(rec->max_ind_blocks
+ * sizeof(blk_t),
+ (void **) &rec->ind_blocks);
+ if (retval) {
+ rec->err = retval;
return BLOCK_ABORT;
}
}
const char *descr, char *init_map,
ext2fs_generic_bitmap *ret)
{
- ext2fs_generic_bitmap bitmap;
- size_t size;
+ ext2fs_generic_bitmap bitmap;
+ errcode_t retval;
+ size_t size;
- bitmap = malloc(sizeof(struct ext2fs_struct_generic_bitmap));
- if (!bitmap)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2fs_struct_generic_bitmap),
+ (void **) &bitmap);
+ if (retval)
+ return retval;
bitmap->magic = EXT2_ET_MAGIC_GENERIC_BITMAP;
bitmap->fs = NULL;
bitmap->real_end = real_end;
bitmap->base_error_code = EXT2_ET_BAD_GENERIC_MARK;
if (descr) {
- bitmap->description = malloc(strlen(descr)+1);
- if (!bitmap->description) {
- free(bitmap);
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(strlen(descr)+1,
+ (void **) &bitmap->description);
+ if (retval) {
+ ext2fs_free_mem((void **) &bitmap);
+ return retval;
}
strcpy(bitmap->description, descr);
} else
bitmap->description = 0;
size = (size_t) (((bitmap->real_end - bitmap->start) / 8) + 1);
- bitmap->bitmap = malloc(size);
- if (!bitmap->bitmap) {
- free(bitmap->description);
- free(bitmap);
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(size, (void **) &bitmap->bitmap);
+ if (retval) {
+ ext2fs_free_mem((void **) &bitmap->description);
+ ext2fs_free_mem((void **) &bitmap);
+ return retval;
}
if (init_map)
if (block_buf) {
ctx.ind_buf = block_buf;
} else {
- ctx.ind_buf = malloc(fs->blocksize * 3);
- if (!ctx.ind_buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize * 3,
+ (void **) &ctx.ind_buf);
+ if (retval)
+ return retval;
}
ctx.dind_buf = ctx.ind_buf + fs->blocksize;
ctx.tind_buf = ctx.dind_buf + fs->blocksize;
}
if (!block_buf)
- free(ctx.ind_buf);
+ ext2fs_free_mem((void **) &ctx.ind_buf);
return (ret & BLOCK_ERROR) ? ctx.errcode : 0;
}
addr_per_block = fs->blocksize >> 2;
if (!block_buf) {
- buf = malloc(fs->blocksize * 2);
- if (!buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize * 2, (void **) &buf);
+ if (retval)
+ return retval;
block_buf = buf;
}
&blocks_alloc, block, phys_blk);
done:
if (buf)
- free(buf);
+ ext2fs_free_mem((void **) &buf);
if ((retval == 0) && blocks_alloc) {
inode->i_blocks += (blocks_alloc * fs->blocksize) / 512;
retval = ext2fs_write_inode(fs, ino, inode);
pb.alloc_map = alloc_map ? alloc_map : fs->block_map;
pb.flags = flags;
- block_buf = malloc(fs->blocksize * 4);
- if (!block_buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize * 4, (void **) &block_buf);
+ if (retval)
+ return retval;
pb.buf = block_buf + fs->blocksize * 3;
/*
/*
* Allocate memory structures
*/
- retval = EXT2_NO_MEMORY;
- brel = malloc(sizeof(struct ext2_block_relocation_table));
- if (!brel)
+ retval = ext2fs_get_mem(sizeof(struct ext2_block_relocation_table),
+ (void **) &brel);
+ if (retval)
goto errout;
memset(brel, 0, sizeof(struct ext2_block_relocation_table));
- brel->name = malloc(strlen(name)+1);
- if (!brel->name)
+ retval = ext2fs_get_mem(strlen(name)+1, (void **) &brel->name);
+ if (retval)
goto errout;
strcpy(brel->name, name);
- ma = malloc(sizeof(struct brel_ma));
- if (!ma)
+ retval = ext2fs_get_mem(sizeof(struct brel_ma), (void **) &ma);
+ if (retval)
goto errout;
memset(ma, 0, sizeof(struct brel_ma));
brel->private = ma;
size = (size_t) (sizeof(struct ext2_block_relocate_entry) *
(max_block+1));
- ma->entries = malloc(size);
- if (!ma->entries)
+ retval = ext2fs_get_mem(size, (void **) &ma->entries);
+ if (retval)
goto errout;
memset(ma->entries, 0, size);
ma->max_block = max_block;
if (ma) {
if (ma->entries)
- free (ma->entries);
- free(ma);
+ ext2fs_free_mem((void **) &ma->entries);
+ ext2fs_free_mem((void **) &ma);
}
if (brel->name)
- free(brel->name);
- free (brel);
+ ext2fs_free_mem((void **) &brel->name);
+ ext2fs_free_mem((void **) &brel);
return 0;
}
fs->super->s_wtime = time(NULL);
if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
retval = EXT2_NO_MEMORY;
- if (!(super_shadow = malloc(SUPERBLOCK_SIZE)))
+ retval = ext2fs_get_mem(SUPERBLOCK_SIZE,
+ (void **) &super_shadow);
+ if (retval)
goto errout;
- if (!(group_shadow = malloc((size_t) fs->blocksize *
- fs->desc_blocks)))
+ retval = ext2fs_get_mem((size_t)(fs->blocksize *
+ fs->desc_blocks),
+ (void **) &group_shadow);
+ if (retval)
goto errout;
memset(group_shadow, 0, (size_t) fs->blocksize *
fs->desc_blocks);
fs->super->s_state = fs_state;
if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
if (super_shadow)
- free(super_shadow);
+ ext2fs_free_mem((void **) &super_shadow);
if (group_shadow)
- free(group_shadow);
+ ext2fs_free_mem((void **) &group_shadow);
}
return retval;
}
(fs->dblist->magic == EXT2_ET_MAGIC_DBLIST))
return 0;
- dblist = malloc(sizeof(struct ext2_struct_dblist));
- if (!dblist)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2_struct_dblist),
+ (void **) &dblist);
+ if (retval)
+ return retval;
memset(dblist, 0, sizeof(struct ext2_struct_dblist));
dblist->magic = EXT2_ET_MAGIC_DBLIST;
}
len = (size_t) sizeof(struct ext2_db_entry) * dblist->size;
dblist->count = count;
- dblist->list = malloc(len);
- if (dblist->list == NULL) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(len, (void **) &dblist->list);
+ if (retval)
goto cleanup;
- }
+
if (list)
memcpy(dblist->list, list, len);
else
return 0;
cleanup:
if (dblist)
- free(dblist);
+ ext2fs_free_mem((void **) &dblist);
return retval;
}
errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ino_t ino, blk_t blk,
int blockcnt)
{
- struct ext2_db_entry *nlist, *new;
+ struct ext2_db_entry *new;
+ errcode_t retval;
EXT2_CHECK_MAGIC(dblist, EXT2_ET_MAGIC_DBLIST);
if (dblist->count >= dblist->size) {
dblist->size += 100;
- nlist = realloc(dblist->list, (size_t) dblist->size *
- sizeof(struct ext2_db_entry));
- if (nlist == 0) {
+ retval = ext2fs_resize_mem((size_t) dblist->size *
+ sizeof(struct ext2_db_entry),
+ (void **) &dblist->list);
+ if (retval) {
dblist->size -= 100;
- return EXT2_NO_MEMORY;
+ return retval;
}
- dblist->list = nlist;
}
new = dblist->list + ( (int) dblist->count++);
new->blk = blk;
if (block_buf)
ctx.buf = block_buf;
else {
- ctx.buf = malloc(dblist->fs->blocksize);
- if (!ctx.buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(dblist->fs->blocksize,
+ (void **) &ctx.buf);
+ if (retval)
+ return retval;
}
ctx.func = 0;
ctx.func2 = func;
retval = ext2fs_dblist_iterate(dblist, db_dir_proc, &ctx);
if (!block_buf)
- free(ctx.buf);
+ ext2fs_free_mem((void **) &ctx.buf);
if (retval)
return retval;
return ctx.errcode;
if (block_buf)
ctx.buf = block_buf;
else {
- ctx.buf = malloc(fs->blocksize);
- if (!ctx.buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &ctx.buf);
+ if (retval)
+ return retval;
}
ctx.func = func;
ctx.func2 = 0;
retval = ext2fs_block_iterate(fs, dir, 0, 0,
ext2fs_process_dir_block, &ctx);
if (!block_buf)
- free(ctx.buf);
+ ext2fs_free_mem((void **) &ctx.buf);
if (retval)
return retval;
return ctx.errcode;
if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ||
(fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)) {
- write_buf = buf = malloc(fs->blocksize);
- if (!buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buf);
+ if (retval)
+ return retval;
+ write_buf = buf;
memcpy(buf, inbuf, fs->blocksize);
p = buf;
end = buf + fs->blocksize;
write_buf = inbuf;
retval = io_channel_write_blk(fs->io, block, 1, write_buf);
if (buf)
- free(buf);
+ ext2fs_free_mem((void **) &buf);
return retval;
}
EXT2_CHECK_MAGIC(src, EXT2_ET_MAGIC_EXT2FS_FILSYS);
- fs = (ext2_filsys) malloc(sizeof(struct struct_ext2_filsys));
- if (!fs)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct struct_ext2_filsys),
+ (void **) &fs);
+ if (retval)
+ return retval;
*fs = *src;
fs->device_name = 0;
if (fs->icache)
fs->icache->refcount++;
- retval = EXT2_NO_MEMORY;
- fs->device_name = malloc(strlen(src->device_name)+1);
- if (!fs->device_name)
+ retval = ext2fs_get_mem(strlen(src->device_name)+1,
+ (void **) &fs->device_name);
+ if (retval)
goto errout;
strcpy(fs->device_name, src->device_name);
- fs->super = malloc(SUPERBLOCK_SIZE);
- if (!fs->super)
+ retval = ext2fs_get_mem(SUPERBLOCK_SIZE, (void **) &fs->super);
+ if (retval)
goto errout;
memcpy(fs->super, src->super, SUPERBLOCK_SIZE);
- fs->group_desc = malloc((size_t) fs->desc_blocks * fs->blocksize);
- if (!fs->group_desc)
+ retval = ext2fs_get_mem((size_t) fs->desc_blocks * fs->blocksize,
+ (void **) &fs->group_desc);
+ if (retval)
goto errout;
memcpy(fs->group_desc, src->group_desc,
(size_t) fs->desc_blocks * fs->blocksize);
}
es->done = 1;
} else {
- block = malloc(fs->blocksize);
- if (!block) {
- es->err = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &block);
+ if (retval) {
+ es->err = retval;
return BLOCK_ABORT;
}
memset(block, 0, fs->blocksize);
es->err = retval;
return BLOCK_ABORT;
}
- free(block);
+ ext2fs_free_mem((void **) &block);
*blocknr = new_blk;
ext2fs_mark_block_bitmap(fs->block_map, new_blk);
ext2fs_mark_bb_dirty(fs);
const char **date_string);
/* inline functions */
+extern errcode_t ext2fs_get_mem(long size, void **ptr);
+extern errcode_t ext2fs_free_mem(void **ptr);
+extern errcode_t ext2fs_resize_mem(long size, void **ptr);
extern void ext2fs_mark_super_dirty(ext2_filsys fs);
extern void ext2fs_mark_changed(ext2_filsys fs);
extern int ext2fs_test_changed(ext2_filsys fs);
#define _INLINE_ extern __inline__
#endif
+#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
+/*
+ * Allocate memory
+ */
+_INLINE_ errcode_t ext2fs_get_mem(long size, void **ptr)
+{
+ *ptr = malloc(size);
+ if (!*ptr)
+ return EXT2_NO_MEMORY;
+ return 0;
+}
+
+/*
+ * Free memory
+ */
+_INLINE_ errcode_t ext2fs_free_mem(void **ptr)
+{
+ free(*ptr);
+ *ptr = 0;
+ return 0;
+}
+
+/*
+ * Resize memory
+ */
+_INLINE_ errcode_t ext2fs_resize_mem(long size, void **ptr)
+{
+ void *p;
+
+ p = realloc(*ptr, size);
+ if (!p)
+ return EXT2_NO_MEMORY;
+ *ptr = p;
+ return 0;
+}
+#endif /* Custom memory routines */
+
/*
* Mark a filesystem superblock as dirty
*/
!(fs->flags & EXT2_FLAG_RW))
return EXT2_ET_RO_FILSYS;
- file = (ext2_file_t) malloc(sizeof(struct ext2_file));
- if (!file)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2_file), (void **) &file);
+ if (retval)
+ return retval;
memset(file, 0, sizeof(struct ext2_file));
file->magic = EXT2_ET_MAGIC_EXT2_FILE;
if (retval)
goto fail;
- file->buf = malloc(fs->blocksize);
- if (!file->buf) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &file->buf);
+ if (retval)
goto fail;
- }
*ret = file;
return 0;
fail:
if (file->buf)
- free(file->buf);
- free(file);
+ ext2fs_free_mem((void **) &file->buf);
+ ext2fs_free_mem((void **) &file);
return retval;
}
retval = ext2fs_file_flush(file);
if (file->buf)
- free(file->buf);
- free(file);
+ ext2fs_free_mem((void **) &file->buf);
+ ext2fs_free_mem((void **) &file);
return retval;
}
io_channel_close(fs->io);
}
if (fs->device_name)
- free(fs->device_name);
+ ext2fs_free_mem((void **) &fs->device_name);
if (fs->super)
- free(fs->super);
+ ext2fs_free_mem((void **) &fs->super);
if (fs->group_desc)
- free(fs->group_desc);
+ ext2fs_free_mem((void **) &fs->group_desc);
if (fs->block_map)
ext2fs_free_block_bitmap(fs->block_map);
if (fs->inode_map)
fs->magic = 0;
- free(fs);
+ ext2fs_free_mem((void **) &fs);
}
void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap)
bitmap->magic = 0;
if (bitmap->description) {
- free(bitmap->description);
+ ext2fs_free_mem((void **) &bitmap->description);
bitmap->description = 0;
}
if (bitmap->bitmap) {
- free(bitmap->bitmap);
+ ext2fs_free_mem((void **) &bitmap->bitmap);
bitmap->bitmap = 0;
}
- free(bitmap);
+ ext2fs_free_mem((void **) &bitmap);
}
void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap)
if (--icache->refcount)
return;
if (icache->buffer)
- free(icache->buffer);
+ ext2fs_free_mem((void **) &icache->buffer);
if (icache->cache)
- free(icache->cache);
+ ext2fs_free_mem((void **) &icache->cache);
icache->buffer_blk = 0;
- free(icache);
+ ext2fs_free_mem((void **) &icache);
}
/*
return;
if (bb->list)
- free(bb->list);
+ ext2fs_free_mem((void **) &bb->list);
bb->list = 0;
- free(bb);
+ ext2fs_free_mem((void **) &bb);
}
/*
return;
if (dblist->list)
- free(dblist->list);
+ ext2fs_free_mem((void **) &dblist->list);
dblist->list = 0;
if (dblist->fs && dblist->fs->dblist == dblist)
dblist->fs->dblist = 0;
dblist->magic = 0;
- free(dblist);
+ ext2fs_free_mem((void **) &dblist);
}
void *private)
{
struct get_pathname_struct *gp;
+ errcode_t retval;
gp = (struct get_pathname_struct *) private;
!strncmp(dirent->name, "..", 2))
gp->parent = dirent->inode;
if (dirent->inode == gp->search_ino) {
- gp->name = malloc(dirent->name_len + 1);
+ retval = ext2fs_get_mem(dirent->name_len + 1,
+ (void **) &gp->name);
if (!gp->name) {
gp->errcode = EXT2_NO_MEMORY;
return DIRENT_ABORT;
errcode_t retval;
if (dir == ino) {
- *name = malloc(2);
- if (!*name)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(2, (void **)name);
+ if (retval)
+ return retval;
strcpy(*name, (dir == EXT2_ROOT_INO) ? "/" : ".");
return 0;
}
if (!dir || (maxdepth < 0)) {
- *name = malloc(4);
- if (!*name)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(4, (void **)name);
+ if (retval)
+ return retval;
strcpy(*name, "...");
return 0;
}
}
if (gp.name)
- ret = malloc(strlen(parent_name)+strlen(gp.name)+2);
+ retval = ext2fs_get_mem(strlen(parent_name)+strlen(gp.name)+2,
+ (void **) &ret);
else
- ret = malloc(strlen(parent_name)+5); /* strlen("???") + 2 */
-
- if (!ret) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(strlen(parent_name)+5,
+ (void **) &ret);
+ if (retval)
goto cleanup;
- }
+
ret[0] = 0;
if (parent_name[1])
strcat(ret, parent_name);
else
strcat(ret, "???");
*name = ret;
- free(parent_name);
+ ext2fs_free_mem((void **) &parent_name);
retval = 0;
cleanup:
if (gp.name)
- free(gp.name);
+ ext2fs_free_mem((void **) &gp.name);
return retval;
}
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
- buf = malloc(fs->blocksize);
- if (!buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buf);
+ if (retval)
+ return retval;
if (dir == ino)
ino = 0;
retval = ext2fs_get_pathname_int(fs, dir, ino, 32, buf, name);
- free(buf);
+ ext2fs_free_mem((void **) &buf);
return retval;
}
icount->magic = 0;
if (icount->list)
- free(icount->list);
+ ext2fs_free_mem((void **) &icount->list);
if (icount->single)
ext2fs_free_inode_bitmap(icount->single);
if (icount->multiple)
ext2fs_free_inode_bitmap(icount->multiple);
- free(icount);
+ ext2fs_free_mem((void **) &icount);
}
errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, int size,
size = (size_t) hint->size;
}
- icount = malloc(sizeof(struct ext2_icount));
- if (!icount)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2_icount), (void **) &icount);
+ if (retval)
+ return retval;
memset(icount, 0, sizeof(struct ext2_icount));
retval = ext2fs_allocate_inode_bitmap(fs, 0,
printf("Icount allocated %d entries, %d bytes.\n",
icount->size, bytes);
#endif
- icount->list = malloc(bytes);
- if (!icount->list)
+ retval = ext2fs_get_mem(bytes, (void **) &icount->list);
+ if (retval)
goto errout;
memset(icount->list, 0, bytes);
static struct ext2_icount_el *insert_icount_el(ext2_icount_t icount,
ino_t ino, int pos)
{
- struct ext2_icount_el *el, *new_list;
+ struct ext2_icount_el *el;
+ errcode_t retval;
ino_t new_size = 0;
int num;
#if 0
printf("Reallocating icount %d entries...\n", new_size);
#endif
- new_list = realloc(icount->list, (size_t) new_size *
- sizeof(struct ext2_icount_el));
- if (!new_list)
+ retval = ext2fs_resize_mem((size_t) new_size *
+ sizeof(struct ext2_icount_el),
+ (void **) &icount->list);
+ if (retval)
return 0;
icount->size = new_size;
- icount->list = new_list;
}
num = (int) icount->count - pos;
if (num < 0)
if (!param || !param->s_blocks_count)
return EXT2_INVALID_ARGUMENT;
- fs = (ext2_filsys) malloc(sizeof(struct struct_ext2_filsys));
- if (!fs)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct struct_ext2_filsys),
+ (void **) &fs);
+ if (retval)
+ return retval;
memset(fs, 0, sizeof(struct struct_ext2_filsys));
fs->magic = EXT2_ET_MAGIC_EXT2FS_FILSYS;
if (retval)
goto cleanup;
fs->io->app_data = fs;
- fs->device_name = malloc(strlen(name)+1);
- if (!fs->device_name) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(strlen(name)+1, (void **) &fs->device_name);
+ if (retval)
goto cleanup;
- }
+
strcpy(fs->device_name, name);
- fs->super = super = malloc(SUPERBLOCK_SIZE);
- if (!super) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(SUPERBLOCK_SIZE, (void **) &super);
+ if (retval)
goto cleanup;
- }
+ fs->super = super;
+
memset(super, 0, SUPERBLOCK_SIZE);
#define set_field(field, default) (super->field = param->field ? \
* count.
*/
- buf = malloc(strlen(fs->device_name) + 80);
- if (!buf) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(strlen(fs->device_name) + 80,
+ (void **) &buf);
+ if (retval)
goto cleanup;
- }
sprintf(buf, "block bitmap for %s", fs->device_name);
retval = ext2fs_allocate_block_bitmap(fs, buf, &fs->block_map);
if (retval)
goto cleanup;
- free(buf);
+ ext2fs_free_mem((void **) &buf);
- fs->group_desc = malloc((size_t) fs->desc_blocks * fs->blocksize);
- if (!fs->group_desc) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem((size_t) fs->desc_blocks * fs->blocksize,
+ (void **) &fs->group_desc);
+ if (retval)
goto cleanup;
- }
+
memset(fs->group_desc, 0, (size_t) fs->desc_blocks * fs->blocksize);
/*
static errcode_t create_icache(ext2_filsys fs)
{
- int i;
+ errcode_t retval;
+ int i;
if (fs->icache)
return 0;
- fs->icache = malloc(sizeof(struct ext2_inode_cache));
+ retval = ext2fs_get_mem(sizeof(struct ext2_inode_cache),
+ (void **) &fs->icache);
+ if (retval)
+ return retval;
+
memset(fs->icache, 0, sizeof(struct ext2_inode_cache));
- fs->icache->buffer = malloc(fs->blocksize);
- if (!fs->icache->buffer) {
- free(fs->icache);
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &fs->icache->buffer);
+ if (retval) {
+ ext2fs_free_mem((void **) &fs->icache);
+ return retval;
}
fs->icache->buffer_blk = 0;
fs->icache->cache_last = -1;
fs->icache->cache_size = 4;
fs->icache->refcount = 1;
- fs->icache->cache = malloc(sizeof(struct ext2_inode_cache_ent)
- * fs->icache->cache_size);
- if (!fs->icache->cache) {
- free(fs->icache->buffer);
- free(fs->icache);
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2_inode_cache_ent)
+ * fs->icache->cache_size,
+ (void **) &fs->icache->cache);
+ if (retval) {
+ ext2fs_free_mem((void **) &fs->icache->buffer);
+ ext2fs_free_mem((void **) &fs->icache);
+ return retval;
}
for (i=0; i < fs->icache->cache_size; i++)
fs->icache->cache[i].ino = 0;
fs->get_blocks = save_get_blocks;
}
- scan = (ext2_inode_scan) malloc(sizeof(struct ext2_struct_inode_scan));
- if (!scan)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct ext2_struct_inode_scan),
+ (void **) &scan);
+ if (retval)
+ return retval;
memset(scan, 0, sizeof(struct ext2_struct_inode_scan));
scan->magic = EXT2_ET_MAGIC_INODE_SCAN;
scan->current_group = -1;
scan->inode_buffer_blocks = buffer_blocks ? buffer_blocks : 8;
scan->groups_left = fs->group_desc_count;
- scan->inode_buffer = malloc((size_t) (scan->inode_buffer_blocks *
- fs->blocksize));
+ retval = ext2fs_get_mem((size_t) (scan->inode_buffer_blocks *
+ fs->blocksize),
+ (void **) &scan->inode_buffer);
scan->done_group = 0;
scan->done_group_data = 0;
scan->bad_block_ptr = 0;
- if (!scan->inode_buffer) {
- free(scan);
- return EXT2_NO_MEMORY;
+ if (retval) {
+ ext2fs_free_mem((void **) &scan);
+ return retval;
}
- scan->temp_buffer = malloc(scan->inode_size);
- if (!scan->temp_buffer) {
- free(scan->inode_buffer);
- free(scan);
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(scan->inode_size,
+ (void **) &scan->temp_buffer);
+ if (retval) {
+ ext2fs_free_mem((void **) &scan->inode_buffer);
+ ext2fs_free_mem((void **) &scan);
+ return retval;
}
if (scan->fs->badblocks && scan->fs->badblocks->num)
scan->scan_flags |= EXT2_SF_CHK_BADBLOCKS;
if (!scan || (scan->magic != EXT2_ET_MAGIC_INODE_SCAN))
return;
- free(scan->inode_buffer);
+ ext2fs_free_mem((void **) &scan->inode_buffer);
scan->inode_buffer = NULL;
- free(scan->temp_buffer);
+ ext2fs_free_mem((void **) &scan->temp_buffer);
scan->temp_buffer = NULL;
- free(scan);
+ ext2fs_free_mem((void **) &scan);
return;
}
/*
* Allocate memory structures
*/
- retval = EXT2_NO_MEMORY;
- irel = malloc(sizeof(struct ext2_inode_relocation_table));
- if (!irel)
+ retval = ext2fs_get_mem(sizeof(struct ext2_inode_relocation_table),
+ (void **) &irel);
+ if (retval)
goto errout;
memset(irel, 0, sizeof(struct ext2_inode_relocation_table));
- irel->name = malloc(strlen(name)+1);
- if (!irel->name)
+ retval = ext2fs_get_mem(strlen(name)+1, (void **) &irel->name);
+ if (retval)
goto errout;
strcpy(irel->name, name);
- ma = malloc(sizeof(struct irel_ma));
- if (!ma)
+ retval = ext2fs_get_mem(sizeof(struct irel_ma), (void **) &ma);
+ if (retval)
goto errout;
memset(ma, 0, sizeof(struct irel_ma));
irel->private = ma;
size = (size_t) (sizeof(ino_t) * (max_inode+1));
- ma->orig_map = malloc(size);
- if (!ma->orig_map)
+ retval = ext2fs_get_mem(size, (void **) &ma->orig_map);
+ if (retval)
goto errout;
memset(ma->orig_map, 0, size);
size = (size_t) (sizeof(struct ext2_inode_relocate_entry) *
(max_inode+1));
- ma->entries = malloc(size);
- if (!ma->entries)
+ retval = ext2fs_get_mem(size, (void **) &ma->entries);
+ if (retval)
goto errout;
memset(ma->entries, 0, size);
size = (size_t) (sizeof(struct inode_reference_entry) *
(max_inode+1));
- ma->ref_entries = malloc(size);
- if (!ma->ref_entries)
+ retval = ext2fs_get_mem(size, (void **) &ma->ref_entries);
+ if (retval)
goto errout;
memset(ma->ref_entries, 0, size);
ma->max_inode = max_inode;
static errcode_t ima_put(ext2_irel irel, ino_t old,
struct ext2_inode_relocate_entry *ent)
{
- struct irel_ma *ma;
- struct inode_reference_entry *ref_ent;
- struct ext2_inode_reference *new_refs;
- int size;
+ struct inode_reference_entry *ref_ent;
+ struct irel_ma *ma;
+ errcode_t retval;
+ int size;
ma = irel->private;
if (old > ma->max_inode)
if (ref_ent->refs && ent->max_refs !=
ma->entries[(unsigned) old].max_refs) {
size = (sizeof(struct ext2_inode_reference) * ent->max_refs);
- new_refs = realloc(ref_ent->refs, size);
- if (!new_refs)
- return EXT2_NO_MEMORY;
- ref_ent->refs = new_refs;
+ retval = ext2fs_resize_mem(size, (void **) &ref_ent->refs);
+ if (retval)
+ return retval;
}
ma->entries[(unsigned) old] = *ent;
size_t size;
struct inode_reference_entry *ref_ent;
struct ext2_inode_relocate_entry *ent;
+ errcode_t retval;
ma = irel->private;
if (ino > ma->max_inode)
if (ref_ent->refs == 0) {
size = (size_t) ((sizeof(struct ext2_inode_reference) *
ent->max_refs));
- ref_ent->refs = malloc(size);
- if (ref_ent->refs == 0)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(size, (void **) &ref_ent->refs);
+ if (retval)
+ return retval;
memset(ref_ent->refs, 0, size);
ref_ent->num = 0;
}
ma->entries[(unsigned) new] = ma->entries[(unsigned) old];
if (ma->ref_entries[(unsigned) new].refs)
- free(ma->ref_entries[(unsigned) new].refs);
+ ext2fs_free_mem((void **) &ma->ref_entries[(unsigned) new].refs);
ma->ref_entries[(unsigned) new] = ma->ref_entries[(unsigned) old];
ma->entries[(unsigned) old].new = 0;
ma->entries[old].new = 0;
if (ma->ref_entries[(unsigned) old].refs)
- free(ma->ref_entries[(unsigned) old].refs);
+ ext2fs_free_mem((void **) &ma->ref_entries[(unsigned) old].refs);
ma->orig_map[ma->entries[(unsigned) old].orig] = 0;
ma->ref_entries[(unsigned) old].num = 0;
if (ma) {
if (ma->orig_map)
- free (ma->orig_map);
+ ext2fs_free_mem((void **) &ma->orig_map);
if (ma->entries)
- free (ma->entries);
+ ext2fs_free_mem((void **) &ma->entries);
if (ma->ref_entries) {
for (ino = 0; ino <= ma->max_inode; ino++) {
if (ma->ref_entries[(unsigned) ino].refs)
- free(ma->ref_entries[(unsigned) ino].refs);
+ ext2fs_free_mem((void **) &ma->ref_entries[(unsigned) ino].refs);
}
- free(ma->ref_entries);
+ ext2fs_free_mem((void **) &ma->ref_entries);
}
- free(ma);
+ ext2fs_free_mem((void **) &ma);
}
if (irel->name)
- free(irel->name);
- free (irel);
+ ext2fs_free_mem((void **) &irel->name);
+ ext2fs_free_mem((void **) &irel);
return 0;
}
cleanup:
if (block)
- free(block);
+ ext2fs_free_mem((void **) &block);
return retval;
}
return EXT2_ET_SYMLINK_LOOP;
}
if (ei.i_blocks) {
- buffer = malloc (fs->blocksize);
- if (!buffer)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buffer);
+ if (retval)
+ return retval;
retval = io_channel_read_blk(fs->io, ei.i_block[0], 1, buffer);
if (retval) {
- free(buffer);
+ ext2fs_free_mem((void **) &buffer);
return retval;
}
pathname = buffer;
retval = open_namei(fs, root, dir, pathname, ei.i_size, 1,
link_count, buf, res_inode);
if (buffer)
- free (buffer);
+ ext2fs_free_mem((void **) &buffer);
return retval;
}
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
- buf = malloc(fs->blocksize);
- if (!buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buf);
+ if (retval)
+ return retval;
retval = open_namei(fs, root, cwd, name, strlen(name), 0, 0,
buf, inode);
- free(buf);
+ ext2fs_free_mem((void **) &buf);
return retval;
}
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
- buf = malloc(fs->blocksize);
- if (!buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buf);
+ if (retval)
+ return retval;
retval = open_namei(fs, root, cwd, name, strlen(name), 1, 0,
buf, inode);
- free(buf);
+ ext2fs_free_mem((void **) &buf);
return retval;
}
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
- buf = malloc(fs->blocksize);
- if (!buf)
- return EXT2_NO_MEMORY;
-
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buf);
+ if (retval)
+ return retval;
+
retval = follow_link(fs, root, cwd, inode, 0, buf, res_inode);
- free(buf);
+ ext2fs_free_mem((void **) &buf);
return retval;
}
errcode_t ext2fs_new_dir_block(ext2_filsys fs, ino_t dir_ino, ino_t parent_ino,
char **block)
{
- char *buf;
- struct ext2_dir_entry *dir = NULL;
- int rec_len;
+ struct ext2_dir_entry *dir = NULL;
+ errcode_t retval;
+ char *buf;
+ int rec_len;
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
- buf = malloc(fs->blocksize);
- if (!buf)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &buf);
+ if (retval)
+ return retval;
memset(buf, 0, fs->blocksize);
dir = (struct ext2_dir_entry *) buf;
dir->rec_len = fs->blocksize;
struct ext2fs_sb *s;
EXT2_CHECK_MAGIC(manager, EXT2_ET_MAGIC_IO_MANAGER);
-
- fs = (ext2_filsys) malloc(sizeof(struct struct_ext2_filsys));
- if (!fs)
- return EXT2_NO_MEMORY;
+
+ retval = ext2fs_get_mem(sizeof(struct struct_ext2_filsys),
+ (void **) &fs);
+ if (retval)
+ return retval;
memset(fs, 0, sizeof(struct struct_ext2_filsys));
fs->magic = EXT2_ET_MAGIC_EXT2FS_FILSYS;
if (retval)
goto cleanup;
fs->io->app_data = fs;
- fs->device_name = malloc(strlen(name)+1);
- if (!fs->device_name) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(strlen(name)+1, (void **) &fs->device_name);
+ if (retval)
goto cleanup;
- }
strcpy(fs->device_name, name);
- fs->super = malloc(SUPERBLOCK_SIZE);
- if (!fs->super) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(SUPERBLOCK_SIZE, (void **) &fs->super);
+ if (retval)
goto cleanup;
- }
/*
* If the user specifies a specific block # for the
fs->desc_blocks = (fs->group_desc_count +
EXT2_DESC_PER_BLOCK(fs->super) - 1)
/ EXT2_DESC_PER_BLOCK(fs->super);
- fs->group_desc = malloc((size_t) (fs->desc_blocks * fs->blocksize));
- if (!fs->group_desc) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->desc_blocks * fs->blocksize,
+ (void **) &fs->group_desc);
+ if (retval)
goto cleanup;
- }
if (!group_block)
group_block = fs->super->s_first_data_block + 1;
dest = (char *) fs->group_desc;
errcode_t ext2fs_resize_generic_bitmap(__u32 new_end, __u32 new_real_end,
ext2fs_generic_bitmap bmap)
{
- size_t size, new_size;
- char *new_bitmap;
- __u32 bitno;
+ errcode_t retval;
+ size_t size, new_size;
+ __u32 bitno;
if (!bmap)
return EXT2_INVALID_ARGUMENT;
size = ((bmap->real_end - bmap->start) / 8) + 1;
new_size = ((new_real_end - bmap->start) / 8) + 1;
- new_bitmap = realloc(bmap->bitmap, new_size);
- if (!new_bitmap)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_resize_mem(new_size, (void **) &bmap->bitmap);
+ if (retval)
+ return retval;
if (new_size > size)
- memset(new_bitmap + size, 0, new_size - size);
+ memset(bmap->bitmap + size, 0, new_size - size);
- bmap->bitmap = new_bitmap;
bmap->end = new_end;
bmap->real_end = new_real_end;
return 0;
return 0;
nbytes = (size_t) ((EXT2_INODES_PER_GROUP(fs->super)+7) / 8);
- bitmap_block = malloc(fs->blocksize);
- if (!bitmap_block)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &bitmap_block);
+ if (retval)
+ return retval;
memset(bitmap_block, 0xff, fs->blocksize);
for (i = 0; i < fs->group_desc_count; i++) {
memcpy(bitmap_block, inode_bitmap, nbytes);
}
fs->flags |= EXT2_FLAG_CHANGED;
fs->flags &= ~EXT2_FLAG_IB_DIRTY;
- free(bitmap_block);
+ ext2fs_free_mem((void **) &bitmap_block);
return 0;
}
if (!block_bitmap)
return 0;
nbytes = EXT2_BLOCKS_PER_GROUP(fs->super) / 8;
- bitmap_block = malloc(fs->blocksize);
- if (!bitmap_block)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(fs->blocksize, (void **) &bitmap_block);
+ if (retval)
+ return retval;
memset(bitmap_block, 0xff, fs->blocksize);
for (i = 0; i < fs->group_desc_count; i++) {
memcpy(bitmap_block, block_bitmap, nbytes);
}
fs->flags |= EXT2_FLAG_CHANGED;
fs->flags &= ~EXT2_FLAG_BB_DIRTY;
- free(bitmap_block);
+ ext2fs_free_mem((void **) &bitmap_block);
return 0;
}
fs->write_bitmaps = ext2fs_write_bitmaps;
- buf = malloc(strlen(fs->device_name) + 80);
+ retval = ext2fs_get_mem(strlen(fs->device_name) + 80, (void **) &buf);
+ if (retval)
+ return retval;
if (do_block) {
if (fs->block_map)
ext2fs_free_block_bitmap(fs->block_map);
goto cleanup;
inode_bitmap = fs->inode_map->bitmap;
}
- free(buf);
+ ext2fs_free_mem((void **) &buf);
for (i = 0; i < fs->group_desc_count; i++) {
if (block_bitmap) {
cleanup:
if (do_block) {
- free(fs->block_map);
+ ext2fs_free_mem((void **) &fs->block_map);
fs->block_map = 0;
}
if (do_inode) {
- free(fs->inode_map);
+ ext2fs_free_mem((void **) &fs->inode_map);
fs->inode_map = 0;
}
if (buf)
- free(buf);
+ ext2fs_free_mem((void **) &buf);
return retval;
}
#include <sys/types.h>
#endif
-#include "et/com_err.h"
-#include "ext2fs/ext2_err.h"
-#include "ext2fs/ext2_io.h"
+#include <linux/ext2_fs.h>
+
+#include "ext2fs.h"
/*
* For checking structure magic numbers...
if (name == 0)
return EXT2_ET_BAD_DEVICE_NAME;
- io = (io_channel) malloc(sizeof(struct struct_io_channel));
- if (!io)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct struct_io_channel),
+ (void **) &io);
+ if (retval)
+ return retval;
memset(io, 0, sizeof(struct struct_io_channel));
io->magic = EXT2_ET_MAGIC_IO_CHANNEL;
- data = (struct test_private_data *)
- malloc(sizeof(struct test_private_data));
- if (!data) {
+ retval = ext2fs_get_mem(sizeof(struct test_private_data),
+ (void **) &data);
+ if (retval) {
retval = EXT2_NO_MEMORY;
goto cleanup;
}
io->manager = test_io_manager;
- io->name = malloc(strlen(name)+1);
- if (!io->name) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(strlen(name)+1, (void **) &io->name);
+ if (retval)
goto cleanup;
- }
+
strcpy(io->name, name);
io->private_data = data;
io->block_size = 1024;
cleanup:
if (io)
- free(io);
+ ext2fs_free_mem((void **) &io);
if (data)
- free(data);
+ ext2fs_free_mem((void **) &data);
return retval;
}
retval = io_channel_close(data->real);
if (channel->private_data)
- free(channel->private_data);
+ ext2fs_free_mem((void **) &channel->private_data);
if (channel->name)
- free(channel->name);
- free(channel);
+ ext2fs_free_mem((void **) &channel->name);
+ ext2fs_free_mem((void **) &channel);
return retval;
}
#include <sys/types.h>
#endif
-#include "et/com_err.h"
-#include "ext2fs/ext2_err.h"
-#include "ext2fs/ext2_io.h"
+#include <linux/ext2_fs.h>
+
+#include "ext2fs.h"
/*
* For checking structure magic numbers...
if (name == 0)
return EXT2_ET_BAD_DEVICE_NAME;
- io = (io_channel) malloc(sizeof(struct struct_io_channel));
- if (!io)
- return EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct struct_io_channel),
+ (void **) &io);
+ if (retval)
+ return retval;
memset(io, 0, sizeof(struct struct_io_channel));
io->magic = EXT2_ET_MAGIC_IO_CHANNEL;
- data = (struct unix_private_data *)
- malloc(sizeof(struct unix_private_data));
- if (!data) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(sizeof(struct unix_private_data),
+ (void **) &data);
+ if (retval)
goto cleanup;
- }
+
io->manager = unix_io_manager;
- io->name = malloc(strlen(name)+1);
- if (!io->name) {
- retval = EXT2_NO_MEMORY;
+ retval = ext2fs_get_mem(strlen(name)+1, (void **) &io->name);
+ if (retval)
goto cleanup;
- }
+
strcpy(io->name, name);
io->private_data = data;
io->block_size = 1024;
memset(data, 0, sizeof(struct unix_private_data));
data->magic = EXT2_ET_MAGIC_UNIX_IO_CHANNEL;
- data->buf = malloc(io->block_size);
+ retval = ext2fs_get_mem(io->block_size, (void **) &data->buf);
data->buf_block_nr = -1;
- if (!data->buf) {
- retval = EXT2_NO_MEMORY;
+ if (retval)
goto cleanup;
- }
+
data->dev = open(name, (flags & IO_FLAG_RW) ? O_RDWR : O_RDONLY);
if (data->dev < 0) {
retval = errno;
cleanup:
if (io)
- free(io);
+ ext2fs_free_mem((void **) &io);
if (data) {
if (data->buf)
- free(data->buf);
- free(data);
+ ext2fs_free_mem((void **) &data->buf);
+ ext2fs_free_mem((void **) &data);
}
return retval;
}
if (close(data->dev) < 0)
retval = errno;
if (data->buf)
- free(data->buf);
+ ext2fs_free_mem((void **) &data->buf);
if (channel->private_data)
- free(channel->private_data);
+ ext2fs_free_mem((void **) &channel->private_data);
if (channel->name)
- free(channel->name);
- free(channel);
+ ext2fs_free_mem((void **) &channel->name);
+ ext2fs_free_mem((void **) &channel);
return retval;
}
static errcode_t unix_set_blksize(io_channel channel, int blksize)
{
struct unix_private_data *data;
+ errcode_t retval;
EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
data = (struct unix_private_data *) channel->private_data;
if (channel->block_size != blksize) {
channel->block_size = blksize;
- free(data->buf);
- data->buf = malloc(blksize);
- if (!data->buf)
- return EXT2_NO_MEMORY;
+ ext2fs_free_mem((void **) &data->buf);
+ retval = ext2fs_get_mem(blksize, (void **) &data->buf);
+ if (retval)
+ return retval;
data->buf_block_nr = -1;
}
return 0;