|
@@ -0,0 +1,175 @@
|
|
|
+Subject: Bump recursion to 15, and allow it to be set from the command line
|
|
|
+Upstream-Author: Christos Zoulas <christos@zoulas.com>
|
|
|
+Date: Thu Nov 27 15:40:36 2014 +0000
|
|
|
+Origin: FILE5_20-34-g90018fe
|
|
|
+Last-Update: 2015-01-09
|
|
|
+
|
|
|
+--- a/src/file.c
|
|
|
++++ b/src/file.c
|
|
|
+@@ -106,7 +106,7 @@
|
|
|
+ #undef OPT_LONGONLY
|
|
|
+ {0, 0, NULL, 0}
|
|
|
+ };
|
|
|
+-#define OPTSTRING "bcCde:f:F:hikLm:nNprsvz0"
|
|
|
++#define OPTSTRING "bcCde:f:F:hikLm:nNprR:svz0"
|
|
|
+
|
|
|
+ private const struct {
|
|
|
+ const char *name;
|
|
|
+@@ -144,6 +144,7 @@
|
|
|
+ size_t i;
|
|
|
+ int action = 0, didsomefiles = 0, errflg = 0;
|
|
|
+ int flags = 0, e = 0;
|
|
|
++ size_t max_recursion = 0;
|
|
|
+ struct magic_set *magic = NULL;
|
|
|
+ int longindex;
|
|
|
+ const char *magicfile = NULL; /* where the magic is */
|
|
|
+@@ -244,6 +245,9 @@
|
|
|
+ case 'r':
|
|
|
+ flags |= MAGIC_RAW;
|
|
|
+ break;
|
|
|
++ case 'R':
|
|
|
++ max_recursion = atoi(optarg);
|
|
|
++ break;
|
|
|
+ case 's':
|
|
|
+ flags |= MAGIC_DEVICES;
|
|
|
+ break;
|
|
|
+@@ -303,6 +307,15 @@
|
|
|
+ if (magic == NULL)
|
|
|
+ if ((magic = load(magicfile, flags)) == NULL)
|
|
|
+ return 1;
|
|
|
++ if (max_recursion) {
|
|
|
++ if (magic_setparam(magic, MAGIC_PARAM_MAX_RECURSION,
|
|
|
++ &max_recursion) == -1) {
|
|
|
++ (void)fprintf(stderr,
|
|
|
++ "%s: Can't set recurision %s\n", progname,
|
|
|
++ strerror(errno));
|
|
|
++ return 1;
|
|
|
++ }
|
|
|
++ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+--- a/src/file.h
|
|
|
++++ b/src/file.h
|
|
|
+@@ -363,6 +363,8 @@
|
|
|
+ /* 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 */
|
|
|
++ size_t max_recursion;
|
|
|
++#define FILE_MAX_RECURSION 15
|
|
|
+ };
|
|
|
+
|
|
|
+ /* Type for Unicode characters */
|
|
|
+--- a/src/file_opts.h
|
|
|
++++ b/src/file_opts.h
|
|
|
+@@ -43,6 +43,7 @@
|
|
|
+ OPT('p', "preserve-date", 0, " preserve access times on files\n")
|
|
|
+ #endif
|
|
|
+ OPT('r', "raw", 0, " don't translate unprintable chars to \\ooo\n")
|
|
|
++OPT('R', "recursion", 0, " set maximum recursion level\n")
|
|
|
+ OPT('s', "special-files", 0, " treat special (block/char devices) files as\n"
|
|
|
+ " ordinary ones\n")
|
|
|
+ OPT('C', "compile", 0, " compile file specified by -m\n")
|
|
|
+--- a/src/magic.c
|
|
|
++++ b/src/magic.c
|
|
|
+@@ -142,6 +142,7 @@
|
|
|
+ ms->mlist = NULL;
|
|
|
+ ms->file = "unknown";
|
|
|
+ ms->line = 0;
|
|
|
++ ms->max_recursion = FILE_MAX_RECURSION;
|
|
|
+ return ms;
|
|
|
+ free:
|
|
|
+ free(ms);
|
|
|
+@@ -410,3 +411,29 @@
|
|
|
+ ms->flags = flags;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
++
|
|
|
++public int
|
|
|
++magic_setparam(struct magic_set *ms, int param, const void *val)
|
|
|
++{
|
|
|
++ switch (param) {
|
|
|
++ case MAGIC_PARAM_MAX_RECURSION:
|
|
|
++ ms->max_recursion = *(const size_t *)val;
|
|
|
++ return 0;
|
|
|
++ default:
|
|
|
++ errno = EINVAL;
|
|
|
++ return -1;
|
|
|
++ }
|
|
|
++}
|
|
|
++
|
|
|
++public int
|
|
|
++magic_getparam(struct magic_set *ms, int param, void *val)
|
|
|
++{
|
|
|
++ switch (param) {
|
|
|
++ case MAGIC_PARAM_MAX_RECURSION:
|
|
|
++ *(size_t *)val = ms->max_recursion;
|
|
|
++ return 0;
|
|
|
++ default:
|
|
|
++ errno = EINVAL;
|
|
|
++ return -1;
|
|
|
++ }
|
|
|
++}
|
|
|
+--- a/src/magic.h
|
|
|
++++ b/src/magic.h
|
|
|
+@@ -82,6 +82,10 @@
|
|
|
+ int magic_check(magic_t, const char *);
|
|
|
+ int magic_errno(magic_t);
|
|
|
+
|
|
|
++#define MAGIC_PARAM_MAX_RECURSION 0
|
|
|
++int magic_setparam(magic_t, int, const void *);
|
|
|
++int magic_getparam(magic_t, int, void *);
|
|
|
++
|
|
|
+ #ifdef __cplusplus
|
|
|
+ };
|
|
|
+ #endif
|
|
|
+--- a/src/softmagic.c
|
|
|
++++ b/src/softmagic.c
|
|
|
+@@ -43,9 +43,9 @@
|
|
|
+
|
|
|
+
|
|
|
+ private int match(struct magic_set *, struct magic *, uint32_t,
|
|
|
+- const unsigned char *, size_t, int, int);
|
|
|
++ const unsigned char *, size_t, int, size_t);
|
|
|
+ private int mget(struct magic_set *, const unsigned char *,
|
|
|
+- struct magic *, size_t, unsigned int, int);
|
|
|
++ struct magic *, size_t, unsigned int, size_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 *);
|
|
|
+@@ -62,8 +62,6 @@
|
|
|
+
|
|
|
+ #define OFFSET_OOB(n, o, i) ((n) < (o) || (i) > ((n) - (o)))
|
|
|
+
|
|
|
+-#define MAX_RECURSION_LEVEL 10
|
|
|
+-
|
|
|
+ /*
|
|
|
+ * softmagic - lookup one file in parsed, in-memory copy of database
|
|
|
+ * Passed the name and FILE * of one file to be typed.
|
|
|
+@@ -110,7 +108,7 @@
|
|
|
+ */
|
|
|
+ private int
|
|
|
+ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
|
|
|
+- const unsigned char *s, size_t nbytes, int mode, int recursion_level)
|
|
|
++ const unsigned char *s, size_t nbytes, int mode, size_t recursion_level)
|
|
|
+ {
|
|
|
+ uint32_t magindex = 0;
|
|
|
+ unsigned int cont_level = 0;
|
|
|
+@@ -1049,7 +1047,7 @@
|
|
|
+
|
|
|
+ private int
|
|
|
+ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
+- struct magic *m, size_t nbytes, unsigned int cont_level, int recursion_level)
|
|
|
++ struct magic *m, size_t nbytes, unsigned int cont_level, size_t recursion_level)
|
|
|
+ {
|
|
|
+ uint32_t offset = ms->offset;
|
|
|
+ file_pushbuf_t *pb;
|
|
|
+@@ -1057,7 +1055,7 @@
|
|
|
+ char *rbuf;
|
|
|
+ union VALUETYPE *p = &ms->ms_value;
|
|
|
+
|
|
|
+- if (recursion_level >= MAX_RECURSION_LEVEL) {
|
|
|
++ if (recursion_level >= ms->max_recursion) {
|
|
|
+ file_error(ms, 0, "recursion nesting exceeded");
|
|
|
+ return -1;
|
|
|
+ }
|