Incorrect behavior of grub_file_open () function in e.g. loop context:
char *file_names[] =
{
"(hd0,1)/file1", //file do not exist
"(hd0,1)/file2" //file exist
};
grub_file_t file;
int i;
for (i = 0; i < 2; i++)
{
file = grub_file_open (file_names[i]);
if (file) {...}
}
There, we should get positive return in the second case (i == 1), but
grub_file_open() returns 0.
Using gdb i've found that this problem connected with incorrect errno check
in /kern/file.c
Let's look:
>grub_file_t
>grub_file_open (const char *name)
>{
> grub_device_t device;
> grub_file_t file = 0;
> char *device_name;
> char *file_name;
> device_name = grub_file_get_device_name (name);
> if (grub_errno)
> return 0;
But, we DO NOT set grub_errno to 0 at the begining of the function, thats
why next loop round it always returns 0
PATCH:
--- ./grub2.stable/kern/file.c.orig 2008-01-23 22:30:17.850755634 +0000
+++ ./grub2.stable/kern/file.c 2008-01-23 22:45:17.788904935 +0000
@@ -59,6 +59,8 @@ grub_file_open (const char *name)
char *device_name;
char *file_name;
+ grub_errno = 0;
+
device_name = grub_file_get_device_name (name);
if (grub_errno)
return 0;
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel