All of lore.kernel.org
 help / color / mirror / Atom feed
* /kern/file.c BUG
@ 2008-01-23 23:00 Oleg Strikov
  2008-01-24  0:05 ` Robert Millan
  0 siblings, 1 reply; 16+ messages in thread
From: Oleg Strikov @ 2008-01-23 23:00 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 1190 bytes --]

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;

[-- Attachment #2: Type: text/html, Size: 1601 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread
* Re: /kern/file.c BUG
@ 2008-01-24 21:43 Oleg Strikov
  2008-01-25  3:22 ` Pavel Roskin
  0 siblings, 1 reply; 16+ messages in thread
From: Oleg Strikov @ 2008-01-24 21:43 UTC (permalink / raw)
  To: grub-devel

[-- Attachment #1: Type: text/plain, Size: 815 bytes --]

On Jan 24, 2008 9:42 PM, Oleg Strikov <oleg.strikov@gmail.com> wrote:

>
> >> Previous behavior was working correctly. You have to handle
> > >> errorcodes
> > >> at some point and that means when error is handled it is zeroed (or
> > >> GRUB_ERR_NONE). So code is in callee where that loop was.
> >
> > >I suggest that we never set grub_errno to 0 (except the
> > initialization).
> > >That would match the standard errno behavior:
> >
> > >http://www.opengroup.org/onlinepubs/009695399/functions/errno.html
> > <http://www.opengroup.org/onlinepubs/009695399/functions/errno.html>
> >
> > >--
> > >Regards,
> > >Pavel Roskin
>
>
> But is it correct to check and handle  errno in some `library` function
> (now we do) ?  I CAN, but i do not have to examine  errno after each
> non-error-free call; is it right?
>
>

[-- Attachment #2: Type: text/html, Size: 1325 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2008-01-26 17:06 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-23 23:00 /kern/file.c BUG Oleg Strikov
2008-01-24  0:05 ` Robert Millan
2008-01-24 18:08   ` Vesa Jääskeläinen
2008-01-24 18:34     ` Pavel Roskin
2008-01-24 21:19       ` Yoshinori K. Okuji
2008-01-24 22:09         ` Marco Gerards
2008-01-24 23:00           ` Robert Millan
2008-01-24 23:27         ` Robert Millan
2008-01-25  8:47           ` Marco Gerards
2008-01-25  8:45       ` Marco Gerards
2008-01-25  8:50     ` Marco Gerards
2008-01-25 23:57       ` Robert Millan
2008-01-26 12:04         ` Marco Gerards
2008-01-26 17:05           ` Robert Millan
  -- strict thread matches above, loose matches on Subject: below --
2008-01-24 21:43 Oleg Strikov
2008-01-25  3:22 ` Pavel Roskin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.