grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

/kern/file.c BUG


From: Oleg Strikov
Subject: /kern/file.c BUG
Date: Wed, 23 Jan 2008 23:00:57 +0000

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;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]