From 3b99cee600fd5ace20bac0b2c4c350887f2753ef Mon Sep 17 00:00:00 2001 From: Yura Pakhuchiy Date: Tue, 11 Sep 2007 16:58:01 +0300 Subject: [PATCH] Fix directory corruption in index code. (Szaka) TODO/FIXME: This hardly readable code definitely needs rewrite. Take index.c from 1.13.1 and implement all properly. --- libntfs/index.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/libntfs/index.c b/libntfs/index.c index 2a5e6bd0..5e5760b3 100644 --- a/libntfs/index.c +++ b/libntfs/index.c @@ -1108,6 +1108,17 @@ static int ntfs_ia_add(ntfs_index_context *icx) return 0; } +static INDEX_ROOT *ntfs_ir_lookup2(ntfs_inode *ni, ntfschar *name, u32 len) +{ + ntfs_attr_search_ctx *ctx; + INDEX_ROOT *ir; + + ir = ntfs_ir_lookup(ni, name, len, &ctx); + if (ir) + ntfs_attr_put_search_ctx(ctx); + return ir; +} + static int ntfs_ir_reparent(ntfs_index_context *icx) { ntfs_attr_search_ctx *ctx; @@ -1136,7 +1147,7 @@ static int ntfs_ir_reparent(ntfs_index_context *icx) ntfs_log_perror("Failed to move index root to index block"); goto clear_bmp; } - + if (ntfs_ib_write(icx, new_ib_vcn, ib)) goto clear_bmp; @@ -1192,16 +1203,11 @@ static int ntfs_ir_truncate(ntfs_index_context *icx, int data_size) */ ret = ntfs_attr_truncate(na, data_size + offsetof(INDEX_ROOT, index)); if (ret == STATUS_OK) { - ntfs_attr_search_ctx *ctx; - - icx->ir = ntfs_ir_lookup(icx->ni, icx->name, icx->name_len, - &ctx); + icx->ir = ntfs_ir_lookup2(icx->ni, icx->name, icx->name_len); if (!icx->ir) return STATUS_ERROR; icx->ir->index.allocated_size = cpu_to_le32(data_size); - - ntfs_attr_put_search_ctx(ctx); } else { if (errno != ENOSPC && errno != EOVERFLOW) ntfs_log_trace("Failed to truncate INDEX_ROOT"); @@ -1300,6 +1306,10 @@ static int ntfs_ir_insert_median(ntfs_index_context *icx, INDEX_ENTRY *median, ntfs_log_trace("Entering.\n"); + icx->ir = ntfs_ir_lookup2(icx->ni, icx->name, icx->name_len); + if (!icx->ir) + return STATUS_ERROR; + new_size = le32_to_cpu(icx->ir->index.index_length) + le16_to_cpu(median->length); if (!(median->flags & INDEX_ENTRY_NODE)) @@ -1309,6 +1319,10 @@ static int ntfs_ir_insert_median(ntfs_index_context *icx, INDEX_ENTRY *median, if (ret != STATUS_OK) return ret; + icx->ir = ntfs_ir_lookup2(icx->ni, icx->name, icx->name_len); + if (!icx->ir) + return STATUS_ERROR; + return ntfs_ih_insert(&icx->ir->index, median, new_vcn, ntfs_icx_parent_pos(icx)); }