reiserfs: Fix handling of first entry in the directory.
Fixes garbage being added to "." filename.
This commit is contained in:
parent
81ca24a59c
commit
02a249005f
1 changed files with 25 additions and 4 deletions
|
@ -783,12 +783,30 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
||||||
struct grub_reiserfs_key entry_key;
|
struct grub_reiserfs_key entry_key;
|
||||||
enum grub_fshelp_filetype entry_type;
|
enum grub_fshelp_filetype entry_type;
|
||||||
char *entry_name;
|
char *entry_name;
|
||||||
|
char *entry_name_end = 0;
|
||||||
|
char c;
|
||||||
|
|
||||||
if (!(entry_state & GRUB_REISERFS_VISIBLE_MASK))
|
if (!(entry_state & GRUB_REISERFS_VISIBLE_MASK))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
entry_name = (((char *) directory_headers)
|
entry_name = (((char *) directory_headers)
|
||||||
+ grub_le_to_cpu16 (directory_header->location));
|
+ grub_le_to_cpu16 (directory_header->location));
|
||||||
|
if (entry_number == 0)
|
||||||
|
{
|
||||||
|
entry_name_end = (char *) block_header
|
||||||
|
+ grub_le_to_cpu16 (item_headers[block_position].item_location)
|
||||||
|
+ grub_le_to_cpu16 (item_headers[block_position].item_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entry_name_end = (((char *) directory_headers)
|
||||||
|
+ grub_le_to_cpu16 (directory_headers[entry_number - 1].location));
|
||||||
|
}
|
||||||
|
if (entry_name_end < entry_name || entry_name_end > (char *) block_header + block_size)
|
||||||
|
{
|
||||||
|
entry_name_end = (char *) block_header + block_size;
|
||||||
|
}
|
||||||
|
|
||||||
entry_key.directory_id = directory_header->directory_id;
|
entry_key.directory_id = directory_header->directory_id;
|
||||||
entry_key.object_id = directory_header->object_id;
|
entry_key.object_id = directory_header->object_id;
|
||||||
entry_key.u.v2.offset_type = 0;
|
entry_key.u.v2.offset_type = 0;
|
||||||
|
@ -935,7 +953,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Pseudo file ".." never has stat block. */
|
/* Pseudo file ".." never has stat block. */
|
||||||
if (grub_strcmp (entry_name, ".."))
|
if (entry_name_end == entry_name + 2 && grub_memcmp (entry_name, "..", 2) != 0)
|
||||||
grub_dprintf ("reiserfs",
|
grub_dprintf ("reiserfs",
|
||||||
"Warning : %s has no stat block !\n",
|
"Warning : %s has no stat block !\n",
|
||||||
entry_name);
|
entry_name);
|
||||||
|
@ -943,18 +961,21 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item,
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c = *entry_name_end;
|
||||||
|
*entry_name_end = 0;
|
||||||
if (hook (entry_name, entry_type, entry_item, hook_data))
|
if (hook (entry_name, entry_type, entry_item, hook_data))
|
||||||
{
|
{
|
||||||
|
*entry_name_end = c;
|
||||||
grub_dprintf ("reiserfs", "Found : %s, type=%d\n",
|
grub_dprintf ("reiserfs", "Found : %s, type=%d\n",
|
||||||
entry_name, entry_type);
|
entry_name, entry_type);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
|
*entry_name_end = c;
|
||||||
|
|
||||||
next:
|
next:
|
||||||
*entry_name = 0; /* Make sure next entry name (which is just
|
;
|
||||||
before this one in disk order) stops before
|
|
||||||
the current one. */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next_offset == 0)
|
if (next_offset == 0)
|
||||||
|
|
Loading…
Add table
Reference in a new issue