]> granicus.if.org Git - file/commitdiff
- reduce recursion level from 20 to 10 and make a symbolic constant for it.
authorChristos Zoulas <christos@zoulas.com>
Sun, 23 Nov 2014 13:54:27 +0000 (13:54 +0000)
committerChristos Zoulas <christos@zoulas.com>
Sun, 23 Nov 2014 13:54:27 +0000 (13:54 +0000)
- pull out the guts of saving and restoring the output buffer into functions
  and take care not to overwrite the error message if an error happened.

src/file.h
src/funcs.c
src/softmagic.c

index 723a6495272aa8eeb24252f3406dcc7ef1ce5ef4..5145e0a34c23e814c69388155dcf3a304eeb1f73 100644 (file)
@@ -27,7 +27,7 @@
  */
 /*
  * file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.155 2014/10/11 15:03:16 christos Exp $
+ * @(#)$File: file.h,v 1.156 2014/11/23 13:54:27 christos Exp $
  */
 
 #ifndef __file_h__
@@ -495,6 +495,14 @@ protected int file_regexec(file_regex_t *, const char *, size_t, regmatch_t *,
 protected void file_regfree(file_regex_t *);
 protected void file_regerror(file_regex_t *, int, struct magic_set *);
 
+typedef struct {
+       char *buf;
+       uint32_t offset;
+} file_pushbuf_t;
+
+protected file_pushbuf_t *file_push_buffer(struct magic_set *);
+protected char  *file_pop_buffer(struct magic_set *, file_pushbuf_t *);
+
 #ifndef COMPILE_ONLY
 extern const char *file_names[];
 extern const size_t file_nnames;
index d7cce55ff4f6a026e61e2b78ee865ddcb30fe535..407b2f1020e340a284bebacaa26cca56e20dcbc5 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.73 2014/09/10 18:41:51 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.74 2014/11/23 13:54:27 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -491,3 +491,43 @@ file_regerror(file_regex_t *rx, int rc, struct magic_set *ms)
        file_magerror(ms, "regex error %d for `%s', (%s)", rc, rx->pat,
            errmsg);
 }
+
+protected file_pushbuf_t *
+file_push_buffer(struct magic_set *ms)
+{
+       file_pushbuf_t *pb;
+
+       if (ms->event_flags & EVENT_HAD_ERR)
+               return NULL;
+
+       if ((pb = (CAST(file_pushbuf_t *, malloc(sizeof(*pb))))) == NULL)
+               return NULL;
+
+       pb->buf = ms->o.buf;
+       pb->offset = ms->offset;
+
+       ms->o.buf = NULL;
+       ms->offset = 0;
+
+       return pb;
+}
+
+protected char *
+file_pop_buffer(struct magic_set *ms, file_pushbuf_t *pb)
+{
+       char *rbuf;
+
+       if (ms->event_flags & EVENT_HAD_ERR) {
+               free(pb->buf);
+               free(pb);
+               return NULL;
+       }
+
+       rbuf = ms->o.buf;
+
+       ms->o.buf = pb->buf;
+       ms->offset = pb->offset;
+
+       free(pb);
+       return rbuf;
+}
index f4ede421eeea7361c76210bbc9d58ed5fb963342..6b7c2d675e3b3fc9fdf5cf62fccff043cb6b93ad 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: softmagic.c,v 1.197 2014/11/11 17:48:23 christos Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.198 2014/11/23 13:54:27 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -63,6 +63,9 @@ private void cvt_32(union VALUETYPE *, const struct magic *);
 private void cvt_64(union VALUETYPE *, const struct magic *);
 
 #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.
@@ -1217,14 +1220,15 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
     int flip, int recursion_level, int *printed_something,
     int *need_separator, int *returnval)
 {
-       uint32_t soffset, offset = ms->offset;
+       uint32_t offset = ms->offset;
        uint32_t lhs;
+       file_pushbuf_t *pb;
        int rv, oneed_separator, in_type;
-       char *sbuf, *rbuf;
+       char *rbuf;
        union VALUETYPE *p = &ms->ms_value;
        struct mlist ml;
 
-       if (recursion_level >= 20) {
+       if (recursion_level >= MAX_RECURSION_LEVEL) {
                file_error(ms, 0, "recursion nesting exceeded");
                return -1;
        }
@@ -1669,19 +1673,23 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
        case FILE_INDIRECT:
                if (offset == 0)
                        return 0;
+
                if (nbytes < offset)
                        return 0;
-               sbuf = ms->o.buf;
-               soffset = ms->offset;
-               ms->o.buf = NULL;
-               ms->offset = 0;
+
+               if ((pb = file_push_buffer(ms)) == NULL)
+                       return -1;
+
                rv = file_softmagic(ms, s + offset, nbytes - offset,
                    recursion_level, BINTEST, text);
+
                if ((ms->flags & MAGIC_DEBUG) != 0)
                        fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv);
-               rbuf = ms->o.buf;
-               ms->o.buf = sbuf;
-               ms->offset = soffset;
+
+               rbuf = file_pop_buffer(ms, pb);
+               if (rbuf == NULL)
+                       return -1;
+
                if (rv == 1) {
                        if ((ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0 &&
                            file_printf(ms, F(ms, m, "%u"), offset) == -1) {
@@ -1699,13 +1707,13 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
        case FILE_USE:
                if (nbytes < offset)
                        return 0;
-               sbuf = m->value.s;
-               if (*sbuf == '^') {
-                       sbuf++;
+               rbuf = m->value.s;
+               if (*rbuf == '^') {
+                       rbuf++;
                        flip = !flip;
                }
-               if (file_magicfind(ms, sbuf, &ml) == -1) {
-                       file_error(ms, 0, "cannot find entry `%s'", sbuf);
+               if (file_magicfind(ms, rbuf, &ml) == -1) {
+                       file_error(ms, 0, "cannot find entry `%s'", rbuf);
                        return -1;
                }