From bff0f300ffd525b0a2068b2de49e6a81b6c864e6 Mon Sep 17 00:00:00 2001 From: "(none)!yura" <(none)!yura> Date: Wed, 22 Sep 2004 19:22:40 +0000 Subject: [PATCH] fixes for attribute list handling (Logical change 1.578) --- libntfs/attrib.c | 7 +++++-- libntfs/attrlist.c | 24 ++++++++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/libntfs/attrib.c b/libntfs/attrib.c index 67488436..58a25c26 100644 --- a/libntfs/attrib.c +++ b/libntfs/attrib.c @@ -2453,10 +2453,13 @@ int ntfs_attr_record_rm(ntfs_attr_search_ctx *ctx) { } ntfs_inode_mark_dirty(ni); if (type == AT_ATTRIBUTE_LIST) { + if (NInoAttrList(base_ni) && base_ni->attr_list) + free(base_ni->attr_list); + if (NInoAttrListNonResident(base_ni) && base_ni->attr_list_rl) + free(base_ni->attr_list_rl); NInoClearAttrList(base_ni); + NInoClearAttrListNonResident(base_ni); NInoAttrListClearDirty(base_ni); - free(base_ni->attr_list); - free(base_ni->attr_list_rl); } if (le32_to_cpu(ctx->mrec->bytes_in_use) - le16_to_cpu(ctx->mrec->attrs_offset) == 8) { diff --git a/libntfs/attrlist.c b/libntfs/attrlist.c index 71d0cc5a..1764e497 100644 --- a/libntfs/attrlist.c +++ b/libntfs/attrlist.c @@ -179,13 +179,20 @@ int ntfs_attrlist_entry_add(ntfs_inode *ni, ATTR_RECORD *attr) goto err_out; } memcpy(rl, na->rl, rl_size); - free(ni->attr_list_rl); + if (NInoAttrListNonResident(ni) && ni->attr_list_rl) + free(ni->attr_list_rl); ni->attr_list_rl = rl; NInoSetAttrListNonResident(ni); - } else - NInoClearAttrListNonResident(ni); + } else { + if (NInoAttrListNonResident(ni)) { + if (ni->attr_list_rl) + free(ni->attr_list_rl); + NInoClearAttrListNonResident(ni); + } + } - free(ni->attr_list); + if (ni->attr_list) + free(ni->attr_list); ni->attr_list = new_al; ni->attr_list_size = new_al_len; NInoAttrListSetDirty(ni); @@ -278,8 +285,13 @@ int ntfs_attrlist_entry_rm(ntfs_attr_search_ctx *ctx) break; } NInoSetAttrListNonResident(base_ni); - } else - NInoClearAttrListNonResident(base_ni); + } else { + if (NInoAttrListNonResident(base_ni)) { + if (base_ni->attr_list_rl) + free(base_ni->attr_list_rl); + NInoClearAttrListNonResident(base_ni); + } + } free(base_ni->attr_list); base_ni->attr_list = new_al;