Subject: Remove name recursion limit, it is always lower than the count... Rename things for consistency Upstream-Author: Christos Zoulas Date: Fri Nov 28 02:46:39 2014 +0000 Origin: FILE5_20-38-gaf444af Last-Update: 2015-01-05 Remove name recursion limit, it is always lower than the count... Rename things for consistency. (prequisite for TEMP-0000000-B67840) diff --git a/doc/file.man b/doc/file.man index 8ea29ef..dd80d08 100644 --- a/doc/file.man +++ b/doc/file.man @@ -293,13 +293,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 57ec7dc..d45e3c8 100644 --- a/doc/libmagic.man +++ b/doc/libmagic.man @@ -258,13 +258,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/ascmagic.c b/src/ascmagic.c index 3388682..463c614 100644 --- a/src/ascmagic.c +++ b/src/ascmagic.c @@ -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 bda53b3..e144d11 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 702a613..5ce08aa 100644 --- a/src/file.c +++ b/src/file.c @@ -124,11 +124,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 6692b3a..67331e0 100644 --- a/src/file.h +++ b/src/file.h @@ -380,16 +380,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 */ @@ -424,7 +422,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 struct mlist *file_apprentice(struct magic_set *, const char *, int); protected uint64_t file_signextend(struct magic_set *, struct magic *, uint64_t); diff --git a/src/funcs.c b/src/funcs.c index 91b11fc..e7d2bb8 100644 --- a/src/funcs.c +++ b/src/funcs.c @@ -228,7 +228,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 f2bdae5..3aa3474 100644 --- a/src/magic.c +++ b/src/magic.c @@ -233,11 +233,10 @@ magic_open(int flags) ms->mlist = 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); @@ -521,20 +520,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; @@ -546,20 +542,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 6e94ae9..9a13acb 100644 --- a/src/softmagic.c +++ b/src/softmagic.c @@ -43,9 +43,9 @@ FILE_RCSID("@(#)$File: softmagic.c,v 1.147 2011/11/05 15:44:22 rrt Exp $") private int match(struct magic_set *, struct magic *, uint32_t, - const unsigned char *, size_t, int, int, uint16_t, uint16_t, uint16_t *); + const unsigned char *, size_t, int, int, uint16_t, uint16_t *); private int mget(struct magic_set *, const unsigned char *, - struct magic *, size_t, unsigned int, int, uint16_t, uint16_t, uint16_t *); + struct magic *, size_t, unsigned int, int, uint16_t, uint16_t *); 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 *); @@ -69,8 +69,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; uint16_t nc; @@ -82,7 +81,7 @@ file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes, int rv; for (ml = ms->mlist->next; ml != ms->mlist; ml = ml->next) if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes, mode, - text, indir_level, name_level, name_count)) != 0) + text, indir_level, name_count)) != 0) return rv; return 0; @@ -118,7 +117,7 @@ file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes, private int match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, const unsigned char *s, size_t nbytes, int mode, int text, - uint16_t indir_level, uint16_t name_level, uint16_t *name_count) + uint16_t indir_level, uint16_t *name_count) { uint32_t magindex = 0; unsigned int cont_level = 0; @@ -150,7 +149,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, ms->line = m->lineno; /* if main entry matches, print it... */ - switch (mget(ms, s, m, nbytes, cont_level, text, indir_level, name_level, name_count)) { + switch (mget(ms, s, m, nbytes, cont_level, text, indir_level, name_count)) { case -1: return -1; case 0: @@ -233,7 +232,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic, continue; } #endif - switch (mget(ms, s, m, nbytes, cont_level, text, indir_level, name_level, name_count)) { + switch (mget(ms, s, m, nbytes, cont_level, text, indir_level, name_count)) { case -1: return -1; case 0: @@ -1049,7 +1048,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, unsigned int cont_level, int text, - uint16_t indir_level, uint16_t name_level, uint16_t *name_count) + uint16_t indir_level, uint16_t *name_count) { uint32_t offset = ms->offset; file_pushbuf_t *pb; @@ -1057,18 +1056,12 @@ mget(struct magic_set *ms, const unsigned char *s, char *rbuf; union VALUETYPE *p = &ms->ms_value; - 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); @@ -1638,7 +1631,7 @@ mget(struct magic_set *ms, const unsigned char *s, 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);