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 Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel