Lines 379-391
dx_probe(struct dentry *dentry, struct i
Link Here
|
379 |
|
379 |
|
380 |
entries = (struct dx_entry *) (((char *)&root->info) + |
380 |
entries = (struct dx_entry *) (((char *)&root->info) + |
381 |
root->info.info_length); |
381 |
root->info.info_length); |
382 |
assert(dx_get_limit(entries) == dx_root_limit(dir, |
382 |
if (dx_get_limit(entries) != dx_root_limit(dir, |
383 |
root->info.info_length)); |
383 |
root->info.info_length)) { |
|
|
384 |
ext3_warning(dir->i_sb, __FUNCTION__, "Invalid dx limit"); |
385 |
brelse(bh); |
386 |
*err = ERR_BAD_DX_DIR; |
387 |
goto fail; |
388 |
} |
389 |
|
384 |
dxtrace (printk("Look up %x", hash)); |
390 |
dxtrace (printk("Look up %x", hash)); |
385 |
while (1) |
391 |
while (1) |
386 |
{ |
392 |
{ |
387 |
count = dx_get_count(entries); |
393 |
count = dx_get_count(entries); |
388 |
assert (count && count <= dx_get_limit(entries)); |
394 |
if (!count || count > dx_get_limit(entries)) { |
|
|
395 |
ext3_warning(dir->i_sb, __FUNCTION__, |
396 |
"Invalid dx count"); |
397 |
brelse(bh); |
398 |
*err = ERR_BAD_DX_DIR; |
399 |
goto fail2; |
400 |
} |
389 |
p = entries + 1; |
401 |
p = entries + 1; |
390 |
q = entries + count - 1; |
402 |
q = entries + count - 1; |
391 |
while (p <= q) |
403 |
while (p <= q) |
Lines 411-417
dx_probe(struct dentry *dentry, struct i
Link Here
|
411 |
break; |
423 |
break; |
412 |
} |
424 |
} |
413 |
} |
425 |
} |
414 |
assert (at == p - 1); |
426 |
if (at != p - 1) { |
|
|
427 |
brelse(bh); |
428 |
*err = ERR_BAD_DX_DIR; |
429 |
goto fail2; |
430 |
} |
415 |
} |
431 |
} |
416 |
|
432 |
|
417 |
at = p - 1; |
433 |
at = p - 1; |
Lines 423-430
dx_probe(struct dentry *dentry, struct i
Link Here
|
423 |
if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) |
439 |
if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) |
424 |
goto fail2; |
440 |
goto fail2; |
425 |
at = entries = ((struct dx_node *) bh->b_data)->entries; |
441 |
at = entries = ((struct dx_node *) bh->b_data)->entries; |
426 |
assert (dx_get_limit(entries) == dx_node_limit (dir)); |
442 |
if (dx_get_limit(entries) != dx_node_limit (dir)) { |
|
|
443 |
ext3_warning(dir->i_sb, __FUNCTION__, |
444 |
"Invalid dx limit"); |
445 |
brelse(bh); |
446 |
*err = ERR_BAD_DX_DIR; |
447 |
goto fail2; |
448 |
} |
427 |
frame++; |
449 |
frame++; |
|
|
450 |
frame->bh = NULL; |
428 |
} |
451 |
} |
429 |
fail2: |
452 |
fail2: |
430 |
while (frame >= frame_in) { |
453 |
while (frame >= frame_in) { |