All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
@ 2007-10-23 19:50 Christian Franke
  2007-11-02 20:59 ` Christian Franke
  0 siblings, 1 reply; 7+ messages in thread
From: Christian Franke @ 2007-10-23 19:50 UTC (permalink / raw)
  To: grub-devel

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

This patch enables compilation on systems without the BSD extension 
dirent.d_type. It relies on #define DT_DIR, won't work for enums (glibc 
dirent.h contains both :-).

An alternative would be to include is_dir() unconditionally and call it 
also when d_type == DT_UNKNOWN.

The patch also fixes a grub-emu crash.

Christian


2007-10-23  Christian Franke  <franke@computer.org>

	* util/hostfs.c (is_dir): New function.
	(grub_hostfs_dir):  Handle missing dirent.d_type case.
	(grub_hostfs_label): Clear label pointer. This fixes a crash
	of grub-emu on "ls (host)".




[-- Attachment #2: grub2-hostfs-d_type.patch --]
[-- Type: text/x-patch, Size: 1300 bytes --]

--- grub2.orig/util/hostfs.c	2007-08-02 19:24:06.000000000 +0200
+++ grub2/util/hostfs.c	2007-10-13 17:17:20.000000000 +0200
@@ -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)
+{
+  int len1 = strlen(path), len2 = strlen(name);
+  char pathname[len1+1+len2+1+13];
+  struct stat st;
+  strcpy (pathname, path);
+  /* Avoid UNC-path "//name" on Cygwin */
+  if (len1 > 0 && pathname[len1-1] != '/')
+    strcat (pathname, "/");
+  strcat (pathname, name);
+  if (stat (pathname, &st))
+    return 0;
+  return S_ISDIR(st.st_mode);
+}
+#endif
+
 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);
@@ -101,6 +128,7 @@ static grub_err_t
 grub_hostfs_label (grub_device_t device __attribute ((unused)),
 		   char **label __attribute ((unused)))
 {
+  *label = 0;
   return GRUB_ERR_NONE;
 }
 

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

* Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
  2007-10-23 19:50 [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash Christian Franke
@ 2007-11-02 20:59 ` Christian Franke
  2007-11-09 14:55   ` Marco Gerards
  0 siblings, 1 reply; 7+ messages in thread
From: Christian Franke @ 2007-11-02 20:59 UTC (permalink / raw)
  To: grub-devel

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

Second version of the patch.

It fixes another bug: missing fseek() in grub_hostfs_read().

Christian

2007-11-02  Christian Franke  <franke@computer.org>

	* 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)".




[-- Attachment #2: grub2-hostfs-d_type-2.patch --]
[-- Type: text/x-patch, Size: 1489 bytes --]

--- 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)
+{
+  int len1 = strlen(path), len2 = strlen(name);
+  char pathname[len1+1+len2+1+13];
+  struct stat st;
+  strcpy (pathname, path);
+  /* Avoid UNC-path "//name" on Cygwin */
+  if (len1 > 0 && pathname[len1-1] != '/')
+    strcat (pathname, "/");
+  strcat (pathname, name);
+  if (stat (pathname, &st))
+    return 0;
+  return S_ISDIR(st.st_mode);
+}
+#endif
+
 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);
 
   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;
 }
 

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

* Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
  2007-11-02 20:59 ` Christian Franke
@ 2007-11-09 14:55   ` Marco Gerards
  2007-11-09 21:06     ` Christian Franke
  0 siblings, 1 reply; 7+ messages in thread
From: Marco Gerards @ 2007-11-09 14:55 UTC (permalink / raw)
  To: The development of GRUB 2

Christian Franke <Christian.Franke@t-online.de> writes:

> Second version of the patch.
>
> It fixes another bug: missing fseek() in grub_hostfs_read().
>
> Christian
>
> 2007-11-02  Christian Franke  <franke@computer.org>
>
> 	* 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
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel




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

* Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
  2007-11-09 14:55   ` Marco Gerards
@ 2007-11-09 21:06     ` Christian Franke
  2007-11-10 16:03       ` Marco Gerards
  0 siblings, 1 reply; 7+ messages in thread
From: Christian Franke @ 2007-11-09 21:06 UTC (permalink / raw)
  To: The development of GRUB 2

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

Marco Gerards wrote:

>> ...
>> +static int
>> +is_dir(const char *path, const char *name)
>>     
>
> is_dir (
>
>   

OK. Too many projects, too many policies, sorry :-)


>> +{
>> +  int len1 = strlen(path), len2 = strlen(name);
>>     
>
> Please split this up.  Or even better use separate declarations and
> code.
>
>   

Yes. No. See comment below.


>> +  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. :-)
>
>   

OK.


>> ...
>> +    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?
>
>   

??


>> ...
>> @@ -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 = "
>
>   

Code janitor work outside the scope of this patch ... done ;-)

BTW: This line uses "declaration statement" syntax, therefore this is 
apparently accepted in GRUB2 codebase :-)
I definitely prefer this (first use = declaration = initialization) 
style, which is state of the art in most (all?) modern languages.
This C++ (1986) feature and early GCC (1.*) extension was finally 
included into C99, so it is portable now.
is_dir() rewritten accordingly.

Christian

2007-11-09  Christian Franke  <franke@computer.org>

	* 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)".




[-- Attachment #2: grub2-hostfs-d_type-3.patch --]
[-- Type: text/x-patch, Size: 1457 bytes --]

--- grub2.orig/util/hostfs.c	2007-08-02 19:24:06.000000000 +0200
+++ grub2/util/hostfs.c	2007-11-09 21:41:42.484375000 +0100
@@ -25,6 +25,34 @@
 #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)
+{
+  int len1 = strlen(path);
+  int len2 = strlen(name);
+
+  char pathname[len1 + 1 + len2 + 1 + 13];
+  strcpy (pathname, path);
+
+  /* Avoid UNC-path "//name" on Cygwin.  */
+  if (len1 > 0 && pathname[len1 - 1] != '/')
+    strcat (pathname, "/");
+
+  strcat (pathname, name);
+
+  struct stat st;
+  if (stat (pathname, &st))
+    return 0;
+  return S_ISDIR (st.st_mode);
+}
+#endif
+
 static grub_err_t
 grub_hostfs_dir (grub_device_t device, const char *path, 
 		 int (*hook) (const char *filename, int dir))
@@ -48,7 +76,11 @@
       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,7 +113,8 @@
   FILE *f;
 
   f = (FILE *) file->data;
-  int s= fread (buf, 1, len, f);
+  fseek (f, file->offset, SEEK_SET);
+  int s = fread (buf, 1, len, f);
 
   return s;
 }
@@ -101,6 +134,7 @@
 grub_hostfs_label (grub_device_t device __attribute ((unused)),
 		   char **label __attribute ((unused)))
 {
+  *label = 0;
   return GRUB_ERR_NONE;
 }
 

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

* Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
  2007-11-09 21:06     ` Christian Franke
@ 2007-11-10 16:03       ` Marco Gerards
  2007-11-10 18:16         ` Christian Franke
  2007-11-18  7:14         ` Robert Millan
  0 siblings, 2 replies; 7+ messages in thread
From: Marco Gerards @ 2007-11-10 16:03 UTC (permalink / raw)
  To: The development of GRUB 2

Christian Franke <Christian.Franke@t-online.de> writes:

> Marco Gerards wrote:
>
>>> ...
>>> +static int
>>> +is_dir(const char *path, const char *name)
>>>
>>
>> is_dir (
>>
>>
>
> OK. Too many projects, too many policies, sorry :-)

np, don't worry :-)

Hopefully you are not annoyed by my comments.  A consistent style
throughout GRUB is important to me.

>>> +{
>>> +  int len1 = strlen(path), len2 = strlen(name);
>>>
>>
>> Please split this up.  Or even better use separate declarations and
>> code.
>>
>>
>
> Yes. No. See comment below.
>
>>> +  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. :-)
>>
>>
>
> OK.
>
>
>>> ...
>>> +    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?
>>
>>
>
> ??

Nevermind, I wasn't really awake ;)

>>> ...
>>> @@ -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 = "
>>
>>
>
> Code janitor work outside the scope of this patch ... done ;-)

LOL!  Sorry, I was a bit enthousiastic ;-)

Thanks! :)

> BTW: This line uses "declaration statement" syntax, therefore this is
> apparently accepted in GRUB2 codebase :-)
> I definitely prefer this (first use = declaration = initialization)
> style, which is state of the art in most (all?) modern languages.
> This C++ (1986) feature and early GCC (1.*) extension was finally
> included into C99, so it is portable now.
> is_dir() rewritten accordingly.

It is.  The problem is that you had two function calls on one line.  I
want to avoid that.

> Christian
>
> 2007-11-09  Christian Franke  <franke@computer.org>
>
> 	* 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)".

Looks fine to me.

btw, when do you use (host)?  It's intended as a debugging tool.

--
Marco





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

* Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
  2007-11-10 16:03       ` Marco Gerards
@ 2007-11-10 18:16         ` Christian Franke
  2007-11-18  7:14         ` Robert Millan
  1 sibling, 0 replies; 7+ messages in thread
From: Christian Franke @ 2007-11-10 18:16 UTC (permalink / raw)
  To: The development of GRUB 2

Marco Gerards wrote:
>> ...
>> 2007-11-09  Christian Franke  <franke@computer.org>
>>
>> 	* 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)".
>>     
>
> Looks fine to me.
>   

Thanks.

> btw, when do you use (host)?  It's intended as a debugging tool.
>   

It was there, it didn't work, and it breaked remaining grub-emu device 
access at all. So I fixed it :-)

Christian




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

* Re: [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash
  2007-11-10 16:03       ` Marco Gerards
  2007-11-10 18:16         ` Christian Franke
@ 2007-11-18  7:14         ` Robert Millan
  1 sibling, 0 replies; 7+ messages in thread
From: Robert Millan @ 2007-11-18  7:14 UTC (permalink / raw)
  To: The development of GRUB 2

On Sat, Nov 10, 2007 at 05:03:48PM +0100, Marco Gerards wrote:
> >
> > 2007-11-09  Christian Franke  <franke@computer.org>
> >
> > 	* 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)".
> 
> Looks fine to me.

Committed.

-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call, if you are unable to speak?
(as seen on /.)



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

end of thread, other threads:[~2007-11-18  7:14 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-23 19:50 [PATCH] Allow build without dirent.d_type, fix "ls (host)" crash Christian Franke
2007-11-02 20:59 ` Christian Franke
2007-11-09 14:55   ` Marco Gerards
2007-11-09 21:06     ` Christian Franke
2007-11-10 16:03       ` Marco Gerards
2007-11-10 18:16         ` Christian Franke
2007-11-18  7:14         ` Robert Millan

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.