X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lib%2Fext2fs%2Firel_ma.c;h=2ca6fb5c60cf356bf82fd698aafad2f31cb62ada;hb=5be8dc2143c7b3b21a9b8fb56797dd855ee87560;hp=3a8538ca123870e913959ae58f6094a0c6d5c8ac;hpb=4cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3;p=tools%2Fe2fsprogs.git diff --git a/lib/ext2fs/irel_ma.c b/lib/ext2fs/irel_ma.c index 3a8538c..2ca6fb5 100644 --- a/lib/ext2fs/irel_ma.c +++ b/lib/ext2fs/irel_ma.c @@ -11,7 +11,6 @@ #include #include -#include #include #if HAVE_UNISTD_H #include @@ -74,38 +73,40 @@ errcode_t ext2fs_irel_memarray_create(char *name, ino_t max_inode, /* * Allocate memory structures */ - retval = ENOMEM; - 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 = sizeof(ino_t) * (max_inode+1); - ma->orig_map = malloc(size); - if (!ma->orig_map) + size = (size_t) (sizeof(ino_t) * (max_inode+1)); + retval = ext2fs_get_mem(size, (void **) &ma->orig_map); + if (retval) goto errout; memset(ma->orig_map, 0, size); - size = sizeof(struct ext2_inode_relocate_entry) * (max_inode+1); - ma->entries = malloc(size); - if (!ma->entries) + size = (size_t) (sizeof(struct ext2_inode_relocate_entry) * + (max_inode+1)); + retval = ext2fs_get_mem(size, (void **) &ma->entries); + if (retval) goto errout; memset(ma->entries, 0, size); - size = sizeof(struct inode_reference_entry) * (max_inode+1); - ma->ref_entries = malloc(size); - if (!ma->ref_entries) + size = (size_t) (sizeof(struct inode_reference_entry) * + (max_inode+1)); + retval = ext2fs_get_mem(size, (void **) &ma->ref_entries); + if (retval) goto errout; memset(ma->ref_entries, 0, size); ma->max_inode = max_inode; @@ -136,38 +137,38 @@ errout: 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) - return EINVAL; + return EXT2_ET_INVALID_ARGUMENT; /* * Force the orig field to the correct value; the application * program shouldn't be messing with this field. */ - if (ma->entries[old].new == 0) + if (ma->entries[(unsigned) old].new == 0) ent->orig = old; else - ent->orig = ma->entries[old].orig; + ent->orig = ma->entries[(unsigned) old].orig; /* * If max_refs has changed, reallocate the refs array */ - ref_ent = ma->ref_entries + old; - if (ref_ent->refs && ent->max_refs != ma->entries[old].max_refs) { + ref_ent = ma->ref_entries + (unsigned) old; + 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 ENOMEM; - ref_ent->refs = new_refs; + retval = ext2fs_resize_mem(size, (void **) &ref_ent->refs); + if (retval) + return retval; } - ma->entries[old] = *ent; - ma->orig_map[ent->orig] = old; + ma->entries[(unsigned) old] = *ent; + ma->orig_map[(unsigned) ent->orig] = old; return 0; } @@ -178,10 +179,10 @@ static errcode_t ima_get(ext2_irel irel, ino_t old, ma = irel->private; if (old > ma->max_inode) - return EINVAL; - if (ma->entries[old].new == 0) + return EXT2_ET_INVALID_ARGUMENT; + if (ma->entries[(unsigned) old].new == 0) return ENOENT; - *ent = ma->entries[old]; + *ent = ma->entries[(unsigned) old]; return 0; } @@ -193,12 +194,12 @@ static errcode_t ima_get_by_orig(ext2_irel irel, ino_t orig, ino_t *old, ma = irel->private; if (orig > ma->max_inode) - return EINVAL; - ino = ma->orig_map[orig]; + return EXT2_ET_INVALID_ARGUMENT; + ino = ma->orig_map[(unsigned) orig]; if (ino == 0) return ENOENT; *old = ino; - *ent = ma->entries[ino]; + *ent = ma->entries[(unsigned) ino]; return 0; } @@ -215,10 +216,10 @@ static errcode_t ima_next(ext2_irel irel, ino_t *old, ma = irel->private; while (++irel->current < ma->max_inode) { - if (ma->entries[irel->current].new == 0) + if (ma->entries[(unsigned) irel->current].new == 0) continue; *old = irel->current; - *ent = ma->entries[irel->current]; + *ent = ma->entries[(unsigned) irel->current]; return 0; } *old = 0; @@ -232,30 +233,32 @@ static errcode_t ima_add_ref(ext2_irel irel, ino_t ino, 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) - return EINVAL; + return EXT2_ET_INVALID_ARGUMENT; - ref_ent = ma->ref_entries + ino; - ent = ma->entries + ino; + ref_ent = ma->ref_entries + (unsigned) ino; + ent = ma->entries + (unsigned) ino; /* * If the inode reference array doesn't exist, create it. */ if (ref_ent->refs == 0) { - size = (sizeof(struct ext2_inode_reference) * ent->max_refs); - ref_ent->refs = malloc(size); - if (ref_ent->refs == 0) - return ENOMEM; + size = (size_t) ((sizeof(struct ext2_inode_reference) * + ent->max_refs)); + retval = ext2fs_get_mem(size, (void **) &ref_ent->refs); + if (retval) + return retval; memset(ref_ent->refs, 0, size); ref_ent->num = 0; } if (ref_ent->num >= ent->max_refs) - return ENOSPC; + return EXT2_ET_TOO_MANY_REFS; - ref_ent->refs[ref_ent->num++] = *ref; + ref_ent->refs[(unsigned) ref_ent->num++] = *ref; return 0; } @@ -265,8 +268,8 @@ static errcode_t ima_start_iter_ref(ext2_irel irel, ino_t ino) ma = irel->private; if (ino > ma->max_inode) - return EINVAL; - if (ma->entries[ino].new == 0) + return EXT2_ET_INVALID_ARGUMENT; + if (ma->entries[(unsigned) ino].new == 0) return ENOENT; ma->ref_current = ino; ma->ref_iter = 0; @@ -300,18 +303,18 @@ static errcode_t ima_move(ext2_irel irel, ino_t old, ino_t new) ma = irel->private; if ((old > ma->max_inode) || (new > ma->max_inode)) - return EINVAL; - if (ma->entries[old].new == 0) + return EXT2_ET_INVALID_ARGUMENT; + if (ma->entries[(unsigned) old].new == 0) return ENOENT; - ma->entries[new] = ma->entries[old]; - if (ma->ref_entries[new].refs) - free(ma->ref_entries[new].refs); - ma->ref_entries[new] = ma->ref_entries[old]; + ma->entries[(unsigned) new] = ma->entries[(unsigned) old]; + if (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[old].new = 0; - ma->ref_entries[old].num = 0; - ma->ref_entries[old].refs = 0; + ma->entries[(unsigned) old].new = 0; + ma->ref_entries[(unsigned) old].num = 0; + ma->ref_entries[(unsigned) old].refs = 0; ma->orig_map[ma->entries[new].orig] = new; return 0; @@ -323,17 +326,17 @@ static errcode_t ima_delete(ext2_irel irel, ino_t old) ma = irel->private; if (old > ma->max_inode) - return EINVAL; - if (ma->entries[old].new == 0) + return EXT2_ET_INVALID_ARGUMENT; + if (ma->entries[(unsigned) old].new == 0) return ENOENT; ma->entries[old].new = 0; - if (ma->ref_entries[old].refs) - free(ma->ref_entries[old].refs); - ma->orig_map[ma->entries[old].orig] = 0; + if (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[old].num = 0; - ma->ref_entries[old].refs = 0; + ma->ref_entries[(unsigned) old].num = 0; + ma->ref_entries[(unsigned) old].refs = 0; return 0; } @@ -349,20 +352,20 @@ static errcode_t ima_free(ext2_irel irel) 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[ino].refs) - free(ma->ref_entries[ino].refs); + if (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; }