From 31fbe02e0d3726377e898d7691d1d60ddcf8ffbe Mon Sep 17 00:00:00 2001 From: Christos Zoulas Date: Fri, 28 Nov 2014 02:46:39 +0000 Subject: [PATCH] Remove name recursion limit, it is always lower than the count... Rename things for consistency. --- doc/file.man | 11 +++++------ doc/libmagic.man | 11 +++++------ src/apprentice.c | 9 ++++----- src/ascmagic.c | 4 ++-- src/elfclass.h | 8 ++++---- src/file.c | 11 +++++------ src/file.h | 20 +++++++++----------- src/funcs.c | 4 ++-- src/magic.c | 32 +++++++++++++------------------- src/softmagic.c | 35 ++++++++++++++--------------------- 10 files changed, 63 insertions(+), 82 deletions(-) diff --git a/doc/file.man b/doc/file.man index 9378b5b3..9a0c6f42 100644 --- a/doc/file.man +++ b/doc/file.man @@ -1,4 +1,4 @@ -.\" $File: file.man,v 1.109 2014/11/28 02:35:05 christos Exp $ +.\" $File: file.man,v 1.110 2014/11/28 02:46:39 christos Exp $ .Dd November 27, 2014 .Dt FILE __CSECTION__ .Os @@ -306,13 +306,12 @@ attempt to preserve the access time of files analyzed, to pretend that never read them. .It Fl P , Fl Fl parameter Ar name=value Set various parameter limits. -.Bl -column "namenum" "Default" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -offset indent +.Bl -column "elf_phnum" "Default" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -offset indent .It Sy "Name" Ta Sy "Default" Ta Sy "Explanation" .It Li indir Ta 15 Ta recursion limit for indirect magic -.It Li name Ta 40 Ta recursion limit for name/use magic -.It Li namenum Ta 30 Ta use count limit for name/use magic -.It Li phnum Ta 128 Ta max ELF program sections processed -.It Li shnum Ta 32768 Ta max ELF sections processed +.It Li name Ta 30 Ta use count limit for name/use magic +.It Li elf_phnum Ta 128 Ta max ELF program sections processed +.It Li elf_shnum Ta 32768 Ta max ELF sections processed .El .It Fl r , Fl Fl raw Don't translate unprintable characters to \eooo. diff --git a/doc/libmagic.man b/doc/libmagic.man index 34a36c93..537cd7b7 100644 --- a/doc/libmagic.man +++ b/doc/libmagic.man @@ -1,4 +1,4 @@ -.\" $File: libmagic.man,v 1.32 2014/11/28 02:35:05 christos Exp $ +.\" $File: libmagic.man,v 1.33 2014/11/28 02:46:39 christos Exp $ .\" .\" Copyright (c) Christos Zoulas 2003. .\" All Rights Reserved. @@ -280,13 +280,12 @@ and .Fn magic_setparam allow getting and setting various limits related to the the magic library. -.Bl -column "MAGIC_PARAM_INDIR_RECURSION" "size_t" "Default" -offset indent +.Bl -column "MAGIC_PARAM_ELF_PHNUM_MAX" "size_t" "Default" -offset indent .It Sy "Parameter" Ta Sy "Type" Ta Sy "Default" -.It Li MAGIC_PARAM_INDIR_RECURSION Ta size_t Ta 15 -.It Li MAGIC_PARAM_NAME_RECURSION Ta size_t Ta 40 +.It Li MAGIC_PARAM_INDIR_MAX Ta size_t Ta 15 .It Li MAGIC_PARAM_NAME_MAX Ta size_t Ta 30 -.It Li MAGIC_PARAM_PHNUM_MAX Ta size_t Ta 128 -.It Li MAGIC_PARAM_SHNUM_MAX Ta size_t Ta 32768 +.It Li MAGIC_PARAM_ELF_PHNUM_MAX Ta size_t Ta 128 +.It Li MAGIC_PARAM_ELF_SHNUM_MAX Ta size_t Ta 32768 .El .Pp The diff --git a/src/apprentice.c b/src/apprentice.c index 1e93df78..cfea6bee 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: apprentice.c,v 1.226 2014/11/28 02:35:05 christos Exp $") +FILE_RCSID("@(#)$File: apprentice.c,v 1.227 2014/11/28 02:46:39 christos Exp $") #endif /* lint */ #include "magic.h" @@ -524,11 +524,10 @@ file_ms_alloc(int flags) ms->mlist[i] = NULL; ms->file = "unknown"; ms->line = 0; - ms->indir_recursion = FILE_INDIR_RECURSION; - ms->name_recursion = FILE_NAME_RECURSION; + ms->indir_max = FILE_INDIR_MAX; ms->name_max = FILE_NAME_MAX; - ms->shnum_max = FILE_ELF_SHNUM; - ms->phnum_max = FILE_ELF_PHNUM; + ms->elf_shnum_max = FILE_ELF_SHNUM_MAX; + ms->elf_phnum_max = FILE_ELF_PHNUM_MAX; return ms; free: free(ms); diff --git a/src/ascmagic.c b/src/ascmagic.c index 8424c432..78a6dbb7 100644 --- a/src/ascmagic.c +++ b/src/ascmagic.c @@ -35,7 +35,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: ascmagic.c,v 1.90 2014/11/28 02:35:05 christos Exp $") +FILE_RCSID("@(#)$File: ascmagic.c,v 1.91 2014/11/28 02:46:39 christos Exp $") #endif /* lint */ #include "magic.h" @@ -147,7 +147,7 @@ file_ascmagic_with_encoding(struct magic_set *ms, const unsigned char *buf, == NULL) goto done; if ((rv = file_softmagic(ms, utf8_buf, - (size_t)(utf8_end - utf8_buf), 0, 0, NULL, + (size_t)(utf8_end - utf8_buf), 0, NULL, TEXTTEST, text)) == 0) rv = -1; } diff --git a/src/elfclass.h b/src/elfclass.h index bda53b34..e144d112 100644 --- a/src/elfclass.h +++ b/src/elfclass.h @@ -36,7 +36,7 @@ #ifdef ELFCORE case ET_CORE: phnum = elf_getu16(swap, elfhdr.e_phnum); - if (phnum > ms->phnum_max) + if (phnum > ms->elf_phnum_max) return toomany(ms, "program", phnum); flags |= FLAGS_IS_CORE; if (dophn_core(ms, clazz, swap, fd, @@ -49,10 +49,10 @@ case ET_EXEC: case ET_DYN: phnum = elf_getu16(swap, elfhdr.e_phnum); - if (phnum > ms->phnum_max) + if (phnum > ms->elf_phnum_max) return toomany(ms, "program", phnum); shnum = elf_getu16(swap, elfhdr.e_shnum); - if (shnum > ms->shnum_max) + if (shnum > ms->elf_shnum_max) return toomany(ms, "section", shnum); if (dophn_exec(ms, clazz, swap, fd, (off_t)elf_getu(swap, elfhdr.e_phoff), phnum, @@ -62,7 +62,7 @@ /*FALLTHROUGH*/ case ET_REL: shnum = elf_getu16(swap, elfhdr.e_shnum); - if (shnum > ms->shnum_max) + if (shnum > ms->elf_shnum_max) return toomany(ms, "section", shnum); if (doshn(ms, clazz, swap, fd, (off_t)elf_getu(swap, elfhdr.e_shoff), shnum, diff --git a/src/file.c b/src/file.c index e9b4cd81..148f806f 100644 --- a/src/file.c +++ b/src/file.c @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: file.c,v 1.158 2014/11/28 02:35:05 christos Exp $") +FILE_RCSID("@(#)$File: file.c,v 1.159 2014/11/28 02:46:39 christos Exp $") #endif /* lint */ #include "magic.h" @@ -121,11 +121,10 @@ private struct { int tag; size_t value; } pm[] = { - { "indir", MAGIC_PARAM_INDIR_RECURSION, 0 }, - { "name", MAGIC_PARAM_NAME_RECURSION, 0 }, - { "namenum", MAGIC_PARAM_NAME_MAX, 0 }, - { "phnum", MAGIC_PARAM_PHNUM_MAX, 0 }, - { "shnum", MAGIC_PARAM_SHNUM_MAX, 0 }, + { "indir", MAGIC_PARAM_INDIR_MAX, 0 }, + { "name", MAGIC_PARAM_NAME_MAX, 0 }, + { "elf_phnum", MAGIC_PARAM_ELF_PHNUM_MAX, 0 }, + { "elf_shnum", MAGIC_PARAM_ELF_SHNUM_MAX, 0 }, }; private char *progname; /* used throughout */ diff --git a/src/file.h b/src/file.h index a0684d65..7a8fea70 100644 --- a/src/file.h +++ b/src/file.h @@ -27,7 +27,7 @@ */ /* * file.h - definitions for file(1) program - * @(#)$File: file.h,v 1.159 2014/11/28 02:35:05 christos Exp $ + * @(#)$File: file.h,v 1.160 2014/11/28 02:46:39 christos Exp $ */ #ifndef __file_h__ @@ -401,16 +401,14 @@ struct magic_set { /* FIXME: Make the string dynamically allocated so that e.g. strings matched in files can be longer than MAXstring */ union VALUETYPE ms_value; /* either number or string */ - uint16_t indir_recursion; - uint16_t name_recursion; + uint16_t indir_max; uint16_t name_max; - uint16_t shnum_max; - uint16_t phnum_max; -#define FILE_INDIR_RECURSION 15 -#define FILE_NAME_RECURSION 40 -#define FILE_NAME_MAX 30 -#define FILE_ELF_SHNUM 32768 -#define FILE_ELF_PHNUM 128 + uint16_t elf_shnum_max; + uint16_t elf_phnum_max; +#define FILE_INDIR_MAX 15 +#define FILE_NAME_MAX 30 +#define FILE_ELF_SHNUM_MAX 32768 +#define FILE_ELF_PHNUM_MAX 128 }; /* Type for Unicode characters */ @@ -450,7 +448,7 @@ protected int file_encoding(struct magic_set *, const unsigned char *, size_t, unichar **, size_t *, const char **, const char **, const char **); protected int file_is_tar(struct magic_set *, const unsigned char *, size_t); protected int file_softmagic(struct magic_set *, const unsigned char *, size_t, - uint16_t, uint16_t, uint16_t *, int, int); + uint16_t, uint16_t *, int, int); protected int file_apprentice(struct magic_set *, const char *, int); protected int buffer_apprentice(struct magic_set *, struct magic **, size_t *, size_t); diff --git a/src/funcs.c b/src/funcs.c index 0b2f6e53..f190349f 100644 --- a/src/funcs.c +++ b/src/funcs.c @@ -27,7 +27,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: funcs.c,v 1.76 2014/11/28 02:35:05 christos Exp $") +FILE_RCSID("@(#)$File: funcs.c,v 1.77 2014/11/28 02:46:39 christos Exp $") #endif /* lint */ #include "magic.h" @@ -227,7 +227,7 @@ file_buffer(struct magic_set *ms, int fd, const char *inname __attribute__ ((unu /* try soft magic tests */ if ((ms->flags & MAGIC_NO_CHECK_SOFT) == 0) - if ((m = file_softmagic(ms, ubuf, nb, 0, 0, NULL, BINTEST, + if ((m = file_softmagic(ms, ubuf, nb, 0, NULL, BINTEST, looks_text)) != 0) { if ((ms->flags & MAGIC_DEBUG) != 0) (void)fprintf(stderr, "softmagic %d\n", m); diff --git a/src/magic.c b/src/magic.c index 83af7759..d8cc04c5 100644 --- a/src/magic.c +++ b/src/magic.c @@ -33,7 +33,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: magic.c,v 1.88 2014/11/28 02:35:05 christos Exp $") +FILE_RCSID("@(#)$File: magic.c,v 1.89 2014/11/28 02:46:39 christos Exp $") #endif /* lint */ #include "magic.h" @@ -541,20 +541,17 @@ public int magic_setparam(struct magic_set *ms, int param, const void *val) { switch (param) { - case MAGIC_PARAM_INDIR_RECURSION: - ms->indir_recursion = *(const size_t *)val; - return 0; - case MAGIC_PARAM_NAME_RECURSION: - ms->name_recursion = *(const size_t *)val; + case MAGIC_PARAM_INDIR_MAX: + ms->indir_max = *(const size_t *)val; return 0; case MAGIC_PARAM_NAME_MAX: ms->name_max = *(const size_t *)val; return 0; - case MAGIC_PARAM_PHNUM_MAX: - ms->phnum_max = *(const size_t *)val; + case MAGIC_PARAM_ELF_PHNUM_MAX: + ms->elf_phnum_max = *(const size_t *)val; return 0; - case MAGIC_PARAM_SHNUM_MAX: - ms->shnum_max = *(const size_t *)val; + case MAGIC_PARAM_ELF_SHNUM_MAX: + ms->elf_shnum_max = *(const size_t *)val; return 0; default: errno = EINVAL; @@ -566,20 +563,17 @@ public int magic_getparam(struct magic_set *ms, int param, void *val) { switch (param) { - case MAGIC_PARAM_INDIR_RECURSION: - *(size_t *)val = ms->indir_recursion; - return 0; - case MAGIC_PARAM_NAME_RECURSION: - *(size_t *)val = ms->name_recursion; + case MAGIC_PARAM_INDIR_MAX: + *(size_t *)val = ms->indir_max; return 0; case MAGIC_PARAM_NAME_MAX: *(size_t *)val = ms->name_max; return 0; - case MAGIC_PARAM_PHNUM_MAX: - *(size_t *)val = ms->phnum_max; + case MAGIC_PARAM_ELF_PHNUM_MAX: + *(size_t *)val = ms->elf_phnum_max; return 0; - case MAGIC_PARAM_SHNUM_MAX: - *(size_t *)val = ms->shnum_max; + case MAGIC_PARAM_ELF_SHNUM_MAX: + *(size_t *)val = ms->elf_shnum_max; return 0; default: errno = EINVAL; diff --git a/src/softmagic.c b/src/softmagic.c index 0ae44671..c9c2acb0 100644 --- a/src/softmagic.c +++ b/src/softmagic.c @@ -32,7 +32,7 @@ #include "file.h" #ifndef lint -FILE_RCSID("@(#)$File: softmagic.c,v 1.201 2014/11/28 02:35:05 christos Exp $") +FILE_RCSID("@(#)$File: softmagic.c,v 1.202 2014/11/28 02:46:39 christos Exp $") #endif /* lint */ #include "magic.h" @@ -43,11 +43,11 @@ FILE_RCSID("@(#)$File: softmagic.c,v 1.201 2014/11/28 02:35:05 christos Exp $") #include private int match(struct magic_set *, struct magic *, uint32_t, - const unsigned char *, size_t, size_t, int, int, int, uint16_t, uint16_t, + const unsigned char *, size_t, size_t, int, int, int, uint16_t, uint16_t *, int *, int *, int *); private int mget(struct magic_set *, const unsigned char *, struct magic *, size_t, size_t, unsigned int, int, int, int, uint16_t, - uint16_t, uint16_t *, int *, int *, int *); + uint16_t *, int *, int *, int *); private int magiccheck(struct magic_set *, struct magic *); private int32_t mprint(struct magic_set *, struct magic *); private int32_t moffset(struct magic_set *, struct magic *); @@ -71,8 +71,7 @@ private void cvt_64(union VALUETYPE *, const struct magic *); /*ARGSUSED1*/ /* nbytes passed for regularity, maybe need later */ protected int file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes, - uint16_t indir_level, uint16_t name_level, uint16_t *name_count, - int mode, int text) + uint16_t indir_level, uint16_t *name_count, int mode, int text) { struct mlist *ml; int rv, printed_something = 0, need_separator = 0; @@ -85,7 +84,7 @@ file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes, for (ml = ms->mlist[0]->next; ml != ms->mlist[0]; ml = ml->next) if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes, 0, mode, - text, 0, indir_level, name_level, name_count, + text, 0, indir_level, name_count, &printed_something, &need_separator, NULL)) != 0) return rv; @@ -141,7 +140,7 @@ file_fmtcheck(struct magic_set *ms, const struct magic *m, const char *def, private int match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, const unsigned char *s, size_t nbytes, size_t offset, int mode, int text, - int flip, uint16_t indir_level, uint16_t name_level, uint16_t *name_count, + int flip, uint16_t indir_level, uint16_t *name_count, int *printed_something, int *need_separator, int *returnval) { uint32_t magindex = 0; @@ -179,7 +178,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, /* if main entry matches, print it... */ switch (mget(ms, s, m, nbytes, offset, cont_level, mode, text, - flip, indir_level, name_level, name_count, + flip, indir_level, name_count, printed_something, need_separator, returnval)) { case -1: return -1; @@ -268,7 +267,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, } #endif switch (mget(ms, s, m, nbytes, offset, cont_level, mode, - text, flip, indir_level, name_level, name_count, + text, flip, indir_level, name_count, printed_something, need_separator, returnval)) { case -1: return -1; @@ -1222,7 +1221,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, private int mget(struct magic_set *ms, const unsigned char *s, struct magic *m, size_t nbytes, size_t o, unsigned int cont_level, int mode, int text, - int flip, uint16_t indir_level, uint16_t name_level, uint16_t *name_count, + int flip, uint16_t indir_level, uint16_t *name_count, int *printed_something, int *need_separator, int *returnval) { uint32_t offset = ms->offset; @@ -1233,18 +1232,12 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m, union VALUETYPE *p = &ms->ms_value; struct mlist ml; - if (indir_level >= ms->indir_recursion) { + if (indir_level >= ms->indir_max) { file_error(ms, 0, "indirect recursion nesting (%hu) exceeded", indir_level); return -1; } - if (name_level >= ms->name_recursion) { - file_error(ms, 0, "name recursion nesting (%hu) exceeded", - name_level); - return -1; - } - if (*name_count >= ms->name_max) { file_error(ms, 0, "name use count (%hu) exceeded", *name_count); @@ -1258,9 +1251,9 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m, if ((ms->flags & MAGIC_DEBUG) != 0) { fprintf(stderr, "mget(type=%d, flag=%x, offset=%u, o=%" SIZE_T_FORMAT "u, " "nbytes=%" SIZE_T_FORMAT - "u, il=%hu, nl=%hu nc=%hu)\n", + "u, il=%hu, nc=%hu)\n", m->type, m->flag, offset, o, nbytes, - indir_level, name_level, *name_count); + indir_level, *name_count); mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE)); #ifndef COMPILE_ONLY file_mdump(m); @@ -1701,7 +1694,7 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m, return -1; rv = file_softmagic(ms, s + offset, nbytes - offset, - indir_level + 1, name_level, name_count, BINTEST, text); + indir_level + 1, name_count, BINTEST, text); if ((ms->flags & MAGIC_DEBUG) != 0) fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv); @@ -1741,7 +1734,7 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m, if (m->flag & NOSPACE) *need_separator = 0; rv = match(ms, ml.magic, ml.nmagic, s, nbytes, offset + o, - mode, text, flip, indir_level, name_level + 1, name_count, + mode, text, flip, indir_level, name_count, printed_something, need_separator, returnval); if (rv != 1) *need_separator = oneed_separator; -- 2.40.0