From d34acd45bff6f2fbd5e3c324136b5c2496955fd7 Mon Sep 17 00:00:00 2001 From: szaka Date: Thu, 9 Feb 2006 21:43:52 +0000 Subject: [PATCH] __ntfs_create(): fix cluster leaks for some special files when index entry creation fails --- libntfs/dir.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/libntfs/dir.c b/libntfs/dir.c index 00b04b1a..3daf6b07 100644 --- a/libntfs/dir.c +++ b/libntfs/dir.c @@ -1110,6 +1110,8 @@ static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni, ntfschar *target, u8 target_len) { ntfs_inode *ni; + ntfs_attr *na; + int rollback_data = 0; FILE_NAME_ATTR *fn = NULL; STANDARD_INFORMATION *si = NULL; int err, fn_len, si_len; @@ -1244,8 +1246,8 @@ static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni, ntfs_log_error("Failed to add DATA attribute.\n"); goto err_out; } - if (data) - free(data); + rollback_data = 1; + free(data); } /* Create FILE_NAME attribute. */ fn_len = sizeof(FILE_NAME_ATTR) + name_len * sizeof(ntfschar); @@ -1293,6 +1295,17 @@ static ntfs_inode *__ntfs_create(ntfs_inode *dir_ni, return ni; err_out: ntfs_log_trace("Failed.\n"); + if (rollback_data) { + na = ntfs_attr_open(ni, AT_DATA, AT_UNNAMED, 0); + if (!na) + ntfs_log_perror("Failed to open data attribute of " + " inode 0x%llx. Run chkdsk.\n", + (unsigned long long)ni->mft_no); + else if (ntfs_attr_rm(na)) + ntfs_log_perror("Failed to remove data attribute of " + "inode 0x%llx. Run chkdsk.\n", + (unsigned long long)ni->mft_no); + } if (ntfs_mft_record_free(ni->vol, ni)) ntfs_log_error("Failed to free MFT record. " "Leaving inconsistent metadata. Run chkdsk.\n");