fix some sloppy memory management

tidy up bmp handling
edge.strict_endians
flatcap 2005-07-12 17:13:29 +00:00
parent 9f50872ec2
commit 0fc1835e47
2 changed files with 45 additions and 50 deletions

View File

@ -46,6 +46,7 @@ GEN_PRINTF (Qprintf, stdout, &opts.quiet, FALSE)
static int ntfs_inode_close2 (ntfs_inode *ni);
static int ntfs_dt_root_replace (struct ntfs_dt *del, int del_num, INDEX_ENTRY *del_ie, INDEX_ENTRY *suc_ie);
static int ntfs_dir_truncate (ntfs_volume *vol, struct ntfs_dir *dir);
/**
* version - Print version information about the program
@ -286,6 +287,28 @@ static const char *ntfsinfo_time_to_str(const s64 sle_ntfs_clock)
}
/**
* ntfs_bmp_rollback
*/
static int ntfs_bmp_rollback (struct ntfs_bmp *bmp)
{
int i;
if ((!bmp) || (bmp->count == 0))
return 0;
for (i = 0; i < bmp->count; i++)
free (bmp->data[i]);
free (bmp->data);
free (bmp->data_vcn);
bmp->data = NULL;
bmp->data_vcn = NULL;
bmp->count = 0;
return 0;
}
/**
* ntfs_bmp_commit
*/
@ -310,11 +333,11 @@ static int ntfs_bmp_commit (struct ntfs_bmp *bmp)
printf ("\ti size = %lld\n", bmp->attr->initialized_size);
#endif
cs = bmp->vol->cluster_size;
printf ("commit bmp inode %lld, 0x%02X (%sresident)\n", bmp->attr->ni->mft_no, bmp->attr->type, NAttrNonResident (bmp->attr) ? "non-" : "");
//printf ("commit bmp inode %lld, 0x%02X (%sresident)\n", bmp->attr->ni->mft_no, bmp->attr->type, NAttrNonResident (bmp->attr) ? "non-" : "");
if (NAttrNonResident (bmp->attr)) {
cs = bmp->vol->cluster_size;
// non-resident
for (i = 0; i < bmp->count; i++) {
#ifdef RM_WRITE
@ -335,34 +358,7 @@ static int ntfs_bmp_commit (struct ntfs_bmp *bmp)
printf (RED "\tntfs_attr_pwrite resident (%lld)\n" END, bmp->attr->data_size);
}
for (i = 0; i < bmp->count; i++)
free (bmp->data[i]);
free (bmp->data); // XXX wipe ->data and ->data_vcn
free (bmp->data_vcn);
bmp->count = 0;
return 0;
}
/**
* ntfs_bmp_rollback
*/
static int ntfs_bmp_rollback (struct ntfs_bmp *bmp)
{
int i;
if ((!bmp) || (bmp->count == 0))
return 0;
printf ("rollback bmp\n");
for (i = 0; i < bmp->count; i++)
free (bmp->data[i]);
free (bmp->data);
free (bmp->data_vcn);
bmp->count = 0;
ntfs_bmp_rollback (bmp);
return 0;
}
@ -379,7 +375,6 @@ static void ntfs_bmp_free (struct ntfs_bmp *bmp)
ntfs_attr_close (bmp->attr);
free (bmp->cache);
free (bmp);
}
@ -409,8 +404,6 @@ static struct ntfs_bmp * ntfs_bmp_alloc (ntfs_inode *inode, ATTR_TYPES type, ntf
bmp->data = NULL;
bmp->data_vcn = NULL;
bmp->count = 0;
bmp->cache = NULL;
bmp->cache_vcn = -1;
return bmp;
}
@ -1190,6 +1183,8 @@ static int ntfs_dt_rollback (struct ntfs_dt *dt)
if (!dt)
return -1;
return 0; // TEMP
for (i = 0; i < dt->child_count; i++) {
if (dt->sub_nodes)
ntfs_dt_rollback (dt->sub_nodes[i]);
@ -1223,9 +1218,9 @@ static void ntfs_dt_free (struct ntfs_dt *dt)
ntfs_dt_rollback (dt);
for (i = 0; i < dt->child_count; i++) {
if (dt->sub_nodes)
ntfs_dt_rollback (dt->sub_nodes[i]);
if (dt->inodes)
//if (dt->sub_nodes)
ntfs_dt_free (dt->sub_nodes[i]);
//if (dt->inodes)
ntfs_inode_close2 (dt->inodes[i]);
}
@ -1459,7 +1454,7 @@ static struct ntfs_dt * ntfs_dt_find2 (struct ntfs_dt *dt, ntfschar *name, int n
//printf ("match %p\n", res);
if (index_num)
*index_num = i;
} else if (r == -1) {
} else if ((r == -1) && (ie->flags & INDEX_ENTRY_NODE)) {
//printf ("recurse\n");
if (!dt->sub_nodes[i]) {
vcn = ntfs_ie_get_vcn (ie);
@ -2116,6 +2111,8 @@ static int ntfs_dir_commit (struct ntfs_dir *dir)
printf (RED "\tntfs_inode_sync %llu\n" END, dir->inode->mft_no);
}
ntfs_dir_truncate (dir->vol, dir);
if (ntfs_dt_commit (dir->index) < 0)
return -1;
@ -2414,8 +2411,7 @@ static int ntfs_dir_truncate (ntfs_volume *vol, struct ntfs_dir *dir)
dir->index->header->flags = 0;
//rollback dir's bmp
ntfs_bmp_rollback (dir->bitmap);
free (dir->bitmap);
ntfs_bmp_free (dir->bitmap);
dir->bitmap = NULL;
/*
@ -3050,12 +3046,16 @@ static BOOL utils_pathname_to_inode2 (ntfs_volume *vol, struct ntfs_dir *parent,
child = ntfs_dir_find2 (dir, unicode, len);
if (!child) {
printf ("can't find %s in %s\n", p, pathname);
break;
goto close;
}
} else {
//printf ("file: %s\n", p);
dt = ntfs_dt_find2 (dir->index, unicode, len, &dt_num);
if (!dt) {
printf ("can't find %s in %s (2)\n", p, pathname);
goto close;
}
if (dt->inodes[dt_num] == NULL) {
dt->inodes[dt_num] = ntfs_inode_open (dir->vol, dt->children[dt_num]->indexed_file);
@ -3246,13 +3246,13 @@ static int ntfs_dt_root_replace (struct ntfs_dt *del, int del_num, INDEX_ENTRY *
src = (u8*) del->data;
dst = attr;
len = del->data_len + suc_ie->length - del_ie->length;
len = suc_ie->length - del_ie->length;
free (del->data);
del->data = attr;
del->data_len = len;
del->data_len += len;
del->header = (INDEX_HEADER*) (del->data + 0x10);
del->header->index_length += (suc_ie->length - del_ie->length);
del->header->allocated_size += (suc_ie->length - del_ie->length);
del->header->index_length += len;
del->header->allocated_size += len;
ntfs_mft_resize_resident (del->dir->inode, AT_INDEX_ROOT, I30, 4, del->data, del->data_len);
@ -3264,7 +3264,6 @@ static int ntfs_dt_root_replace (struct ntfs_dt *del, int del_num, INDEX_ENTRY *
// printf ("\tChild %d %p %d\n", i, del->children[i], del->children[i]->flags);
//printf ("\n");
len = suc_ie->length - del_ie->length;
//printf ("src = %p, dst = %p, len = %d\n", src, dst, len); fflush (stdout);
for (i = 0; i < del->child_count; i++)
@ -5007,8 +5006,6 @@ static int ntfs_file_remove2 (ntfs_volume *vol, struct ntfs_dt *dt, int dt_num)
if (1) ntfs_file_remove (vol, dt, dt_num); // remove name from index
if (1) ntfs_dir_truncate (vol, dir);
if (1) utils_volume_commit (vol);
if (0) utils_volume_rollback (vol);

View File

@ -52,8 +52,6 @@ struct ntfs_bmp {
int count;
u8 **data;
VCN *data_vcn;
u8 *cache;
VCN cache_vcn;
};
/**