Re: file(1): prevent printing unknown magic filename

2011-10-04 Thread Christiano F. Haesbaert
Now thinking again I see no much point in my diff, I prefer yours as
it's easier to update to a newer file(1), no point in changing only
this. 

ok from me.

On Wed, Sep 28, 2011 at 12:33:13AM -0300, Christiano F. Haesbaert wrote:
> On Thu, Sep 22, 2011 at 03:56:11PM +0100, Edd Barrett wrote:
> > Hi,
> > 
> > An upstream of one of the ports I work on (radare2) has imported our file(1)
> > implementation and claims to have found bugs. This is the first:
> > 
> > 'ms->file' will only be assigned to 'fn' after a call to apprentice_load() 
> > and
> > ultimately load_1(), so the file_magwarn() at line 274 would report the 
> > default
> > filename "unknown".
> > 
> > We can trigger this behaviour by executing `file -c`:
> > unknown, 0: Warning: using regular magic file `/etc/magic'
> > 
> > Is it a bug?
> > 
> > Index: apprentice.c
> > ===
> > RCS file: /cvs/src/usr.bin/file/apprentice.c,v
> > retrieving revision 1.29
> > diff -u -r1.29 apprentice.c
> > --- apprentice.c11 Nov 2009 16:21:51 -  1.29
> > +++ apprentice.c22 Sep 2011 14:27:17 -
> > @@ -258,6 +258,7 @@
> > return -1;
> > }
> >  
> > +   ms->file = fn;
> > if (action == FILE_COMPILE) {
> > rv = apprentice_load(ms, &magic, &nmagic, fn, action);
> > if (rv != 0)
> 
> Seems correct to me, but this "fn" seems kinda redundant down the
> stack, except for load_1() which really needs a file and not a
> directory. 
> 
> So I thought we could kill this fn by assigning ms->file right in the
> beginning at file_apprentice(). Also tweak load_1() so it won't do the
> whole processing in an else. 
> 
> Index: apprentice.c
> ===
> RCS file: /cvs/src/usr.bin/file/apprentice.c,v
> retrieving revision 1.29
> diff -d -u -p -w -r1.29 apprentice.c
> --- apprentice.c  11 Nov 2009 16:21:51 -  1.29
> +++ apprentice.c  28 Sep 2011 03:18:29 -
> @@ -96,11 +96,11 @@ private int parse(struct magic_set *, st
>  private int parse_mime(struct magic_set *, struct magic_entry **, uint32_t *,
>  const char *);
>  private void eatsize(const char **);
> -private int apprentice_1(struct magic_set *, const char *, int, struct mlist 
> *);
> +private int apprentice_1(struct magic_set *, int, struct mlist *);
>  private size_t apprentice_magic_strength(const struct magic *);
>  private int apprentice_sort(const void *, const void *);
>  private int apprentice_load(struct magic_set *, struct magic **, uint32_t *,
> -const char *, int);
> +int);
>  private void byteswap(struct magic *, uint32_t);
>  private void bs1(struct magic *);
>  private uint16_t swap2(uint16_t);
> @@ -242,7 +242,7 @@ init_file_tables(void)
>   * Handle one file or directory.
>   */
>  private int
> -apprentice_1(struct magic_set *ms, const char *fn, int action,
> +apprentice_1(struct magic_set *ms, int action,
>  struct mlist *mlist)
>  {
>   struct magic *magic = NULL;
> @@ -259,19 +259,19 @@ apprentice_1(struct magic_set *ms, const
>   }
>  
>   if (action == FILE_COMPILE) {
> - rv = apprentice_load(ms, &magic, &nmagic, fn, action);
> + rv = apprentice_load(ms, &magic, &nmagic, action);
>   if (rv != 0)
>   return -1;
> - rv = apprentice_compile(ms, &magic, &nmagic, fn);
> + rv = apprentice_compile(ms, &magic, &nmagic, ms->file);
>   free(magic);
>   return rv;
>   }
>  
>  #ifndef COMPILE_ONLY
> - if ((rv = apprentice_map(ms, &magic, &nmagic, fn)) == -1) {
> + if ((rv = apprentice_map(ms, &magic, &nmagic, ms->file)) == -1) {
>   if (ms->flags & MAGIC_CHECK)
> - file_magwarn(ms, "using regular magic file `%s'", fn);
> - rv = apprentice_load(ms, &magic, &nmagic, fn, action);
> + file_magwarn(ms, "using regular magic file `%s'", 
> ms->file);
> + rv = apprentice_load(ms, &magic, &nmagic, action);
>   if (rv != 0)
>   return -1;
>   }
> @@ -359,7 +359,8 @@ file_apprentice(struct magic_set *ms, co
>   *p++ = '\0';
>   if (*fn == '\0')
>   break;
> - file_err = apprentice_1(ms, fn, action, mlist);
> + ms->file = fn;
> + file_err = apprentice_1(ms, action, mlist);
>   errs = MAX(errs, file_err);
>   fn = p;
>   }
> @@ -571,13 +572,15 @@ load_1(struct magic_set *ms, int action,
>  {
>   char line[BUFSIZ];
>   size_t lineno = 0;
> - FILE *f = fopen(ms->file = fn, "r");
> - if (f == NULL) {
> + FILE *f;
> + 
> + if ((f = fopen(fn, "r")) == NULL) {
>   if (errno != ENOENT)
>   file_error(ms, errno, "cannot read magic file `%s'",
>  fn);
>   (*errs)++;

Re: file(1): prevent printing unknown magic filename

2011-09-27 Thread Christiano F. Haesbaert
On Thu, Sep 22, 2011 at 03:56:11PM +0100, Edd Barrett wrote:
> Hi,
> 
> An upstream of one of the ports I work on (radare2) has imported our file(1)
> implementation and claims to have found bugs. This is the first:
> 
> 'ms->file' will only be assigned to 'fn' after a call to apprentice_load() and
> ultimately load_1(), so the file_magwarn() at line 274 would report the 
> default
> filename "unknown".
> 
> We can trigger this behaviour by executing `file -c`:
> unknown, 0: Warning: using regular magic file `/etc/magic'
> 
> Is it a bug?
> 
> Index: apprentice.c
> ===
> RCS file: /cvs/src/usr.bin/file/apprentice.c,v
> retrieving revision 1.29
> diff -u -r1.29 apprentice.c
> --- apprentice.c  11 Nov 2009 16:21:51 -  1.29
> +++ apprentice.c  22 Sep 2011 14:27:17 -
> @@ -258,6 +258,7 @@
>   return -1;
>   }
>  
> + ms->file = fn;
>   if (action == FILE_COMPILE) {
>   rv = apprentice_load(ms, &magic, &nmagic, fn, action);
>   if (rv != 0)

Seems correct to me, but this "fn" seems kinda redundant down the
stack, except for load_1() which really needs a file and not a
directory. 

So I thought we could kill this fn by assigning ms->file right in the
beginning at file_apprentice(). Also tweak load_1() so it won't do the
whole processing in an else. 

Index: apprentice.c
===
RCS file: /cvs/src/usr.bin/file/apprentice.c,v
retrieving revision 1.29
diff -d -u -p -w -r1.29 apprentice.c
--- apprentice.c11 Nov 2009 16:21:51 -  1.29
+++ apprentice.c28 Sep 2011 03:18:29 -
@@ -96,11 +96,11 @@ private int parse(struct magic_set *, st
 private int parse_mime(struct magic_set *, struct magic_entry **, uint32_t *,
 const char *);
 private void eatsize(const char **);
-private int apprentice_1(struct magic_set *, const char *, int, struct mlist 
*);
+private int apprentice_1(struct magic_set *, int, struct mlist *);
 private size_t apprentice_magic_strength(const struct magic *);
 private int apprentice_sort(const void *, const void *);
 private int apprentice_load(struct magic_set *, struct magic **, uint32_t *,
-const char *, int);
+int);
 private void byteswap(struct magic *, uint32_t);
 private void bs1(struct magic *);
 private uint16_t swap2(uint16_t);
@@ -242,7 +242,7 @@ init_file_tables(void)
  * Handle one file or directory.
  */
 private int
-apprentice_1(struct magic_set *ms, const char *fn, int action,
+apprentice_1(struct magic_set *ms, int action,
 struct mlist *mlist)
 {
struct magic *magic = NULL;
@@ -259,19 +259,19 @@ apprentice_1(struct magic_set *ms, const
}
 
if (action == FILE_COMPILE) {
-   rv = apprentice_load(ms, &magic, &nmagic, fn, action);
+   rv = apprentice_load(ms, &magic, &nmagic, action);
if (rv != 0)
return -1;
-   rv = apprentice_compile(ms, &magic, &nmagic, fn);
+   rv = apprentice_compile(ms, &magic, &nmagic, ms->file);
free(magic);
return rv;
}
 
 #ifndef COMPILE_ONLY
-   if ((rv = apprentice_map(ms, &magic, &nmagic, fn)) == -1) {
+   if ((rv = apprentice_map(ms, &magic, &nmagic, ms->file)) == -1) {
if (ms->flags & MAGIC_CHECK)
-   file_magwarn(ms, "using regular magic file `%s'", fn);
-   rv = apprentice_load(ms, &magic, &nmagic, fn, action);
+   file_magwarn(ms, "using regular magic file `%s'", 
ms->file);
+   rv = apprentice_load(ms, &magic, &nmagic, action);
if (rv != 0)
return -1;
}
@@ -359,7 +359,8 @@ file_apprentice(struct magic_set *ms, co
*p++ = '\0';
if (*fn == '\0')
break;
-   file_err = apprentice_1(ms, fn, action, mlist);
+   ms->file = fn;
+   file_err = apprentice_1(ms, action, mlist);
errs = MAX(errs, file_err);
fn = p;
}
@@ -571,13 +572,15 @@ load_1(struct magic_set *ms, int action,
 {
char line[BUFSIZ];
size_t lineno = 0;
-   FILE *f = fopen(ms->file = fn, "r");
-   if (f == NULL) {
+   FILE *f;
+   
+   if ((f = fopen(fn, "r")) == NULL) {
if (errno != ENOENT)
file_error(ms, errno, "cannot read magic file `%s'",
   fn);
(*errs)++;
-   } else {
+   return;
+   } 
/* read and parse this file */
for (ms->line = 1; fgets(line, sizeof(line), f) != NULL; 
ms->line++) {
size_t len;
@@ -606,7 +609,6 @@ load_1(struct magic_set *ms, int action,
 
(void)fclose(f);
}
-}
 
 /*
  * parse a file or directory of f

file(1): prevent printing unknown magic filename

2011-09-22 Thread Edd Barrett
Hi,

An upstream of one of the ports I work on (radare2) has imported our file(1)
implementation and claims to have found bugs. This is the first:

'ms->file' will only be assigned to 'fn' after a call to apprentice_load() and
ultimately load_1(), so the file_magwarn() at line 274 would report the default
filename "unknown".

We can trigger this behaviour by executing `file -c`:
unknown, 0: Warning: using regular magic file `/etc/magic'

Is it a bug?

Index: apprentice.c
===
RCS file: /cvs/src/usr.bin/file/apprentice.c,v
retrieving revision 1.29
diff -u -r1.29 apprentice.c
--- apprentice.c11 Nov 2009 16:21:51 -  1.29
+++ apprentice.c22 Sep 2011 14:27:17 -
@@ -258,6 +258,7 @@
return -1;
}
 
+   ms->file = fn;
if (action == FILE_COMPILE) {
rv = apprentice_load(ms, &magic, &nmagic, fn, action);
if (rv != 0)
-- 
Best Regards
Edd Barrett

http://www.theunixzoo.co.uk