Re: file(1): prevent printing unknown magic filename
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)++; - } else { + return; + } /* read and parse this file */ for (ms-line = 1; fgets(line, sizeof(line), f) != NULL; ms-line++) {
Re: file(1): prevent printing unknown magic filename
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 files @@ -614,7 +616,7 @@ load_1(struct magic_set *ms, int action, */
file(1): prevent printing unknown magic filename
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