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.
edge.strict_endians
Yura Pakhuchiy 2007-09-11 16:58:01 +03:00
parent a9a1f28cf5
commit 3b99cee600
1 changed files with 21 additions and 7 deletions

View File

@ -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));
}