grub-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash


From: Marco Gerards
Subject: Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
Date: Fri, 09 Nov 2007 15:55:13 +0100
User-agent: Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux)

Christian Franke <address@hidden> writes:

> Second version of the patch.
>
> It fixes another bug: missing fseek() in grub_hostfs_read().
>
> Christian
>
> 2007-11-02  Christian Franke  <address@hidden>
>
>       * util/hostfs.c (is_dir): New function.
>       (grub_hostfs_dir):  Handle missing dirent.d_type case.
>       (grub_hostfs_read): Add missing fseek().
>       (grub_hostfs_label): Clear label pointer. This fixes a crash
>       of grub-emu on "ls (host)".
>
>
>
> --- grub2.orig/util/hostfs.c  2007-08-02 19:24:06.000000000 +0200
> +++ grub2/util/hostfs.c       2007-11-02 21:31:37.703125000 +0100
> @@ -25,6 +25,29 @@
>  #include <dirent.h>
>  #include <stdio.h>
>  
> +
> +#ifndef DT_DIR
> +/* dirent.d_type is a BSD extension, not part of POSIX */
> +#include <sys/stat.h>
> +#include <string.h>
> +
> +static int
> +is_dir(const char *path, const char *name)

is_dir (

> +{
> +  int len1 = strlen(path), len2 = strlen(name);

Please split this up.  Or even better use separate declarations and
code.

> +  char pathname[len1+1+len2+1+13];

Please add spaces around binary operators.

> +  struct stat st;
> +  strcpy (pathname, path);

Please add more blank lines between your code to make it easier to
read. :-)

> +  /* Avoid UNC-path "//name" on Cygwin */

".  " like explained in a previous email.

> +  if (len1 > 0 && pathname[len1-1] != '/')
> +    strcat (pathname, "/");
> +  strcat (pathname, name);
> +  if (stat (pathname, &st))
> +    return 0;
> +  return S_ISDIR(st.st_mode);
> +}
> +#endif

Why can't you just use S_ISDIR?

>  static grub_err_t
>  grub_hostfs_dir (grub_device_t device, const char *path, 
>                int (*hook) (const char *filename, int dir))
> @@ -48,7 +71,11 @@ grub_hostfs_dir (grub_device_t device, c
>        if (! de)
>       break;
>  
> +#ifdef DT_DIR
>        hook (de->d_name, de->d_type == DT_DIR);
> +#else
> +      hook (de->d_name, is_dir(path, de->d_name));
> +#endif
>      }
>  
>    closedir (dir);
> @@ -81,6 +108,7 @@ grub_hostfs_read (grub_file_t file, char
>    FILE *f;
>  
>    f = (FILE *) file->data;
> +  fseek (f, file->offset, SEEK_SET);
>    int s= fread (buf, 1, len, f);

"int s = "

>    return s;
> @@ -101,6 +129,7 @@ static grub_err_t
>  grub_hostfs_label (grub_device_t device __attribute ((unused)),
>                  char **label __attribute ((unused)))
>  {
> +  *label = 0;
>    return GRUB_ERR_NONE;
>  }
>  
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel





reply via email to

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