]> granicus.if.org Git - file/commitdiff
If a string rule specifies binary or text file data explicitly, make sure
authorChristos Zoulas <christos@zoulas.com>
Tue, 20 Sep 2011 15:30:14 +0000 (15:30 +0000)
committerChristos Zoulas <christos@zoulas.com>
Tue, 20 Sep 2011 15:30:14 +0000 (15:30 +0000)
that the data in the file matches the type before we do any other tests.
This avoids having weak magic types such as msdos, match against text files.

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

index 67a75dfe283d02d98c6071c4f7cf505433e02a17..f6da80ac3aeed496fc7c8841bb5307ac5f3f3d77 100644 (file)
@@ -35,7 +35,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: ascmagic.c,v 1.80 2011/03/12 18:13:54 rrt Exp $")
+FILE_RCSID("@(#)$File: ascmagic.c,v 1.81 2011/03/15 22:16:29 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -70,7 +70,8 @@ trim_nuls(const unsigned char *buf, size_t nbytes)
 }
 
 protected int
-file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
+file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes,
+       int text)
 {
        unichar *ubuf = NULL;
        size_t ulen;
@@ -93,7 +94,7 @@ file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
        }
 
        rv = file_ascmagic_with_encoding(ms, buf, nbytes, ubuf, ulen, code,
-           type);
+           type, text);
 
  done:
        if (ubuf)
@@ -105,7 +106,7 @@ file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
 protected int
 file_ascmagic_with_encoding(struct magic_set *ms, const unsigned char *buf,
     size_t nbytes, unichar *ubuf, size_t ulen, const char *code,
-    const char *type)
+    const char *type, int text)
 {
        unsigned char *utf8_buf = NULL, *utf8_end;
        size_t mlen, i;
@@ -153,7 +154,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), TEXTTEST)) != 0)
+                   (size_t)(utf8_end - utf8_buf), TEXTTEST, text)) != 0)
                        goto subtype_identified;
                else
                        rv = -1;
index 439e291d869ca49b9c90754d91ac02349e5e9c86..610db95b4cfc88d3710ca6ddada15b83356fdb64 100644 (file)
@@ -27,7 +27,7 @@
  */
 /*
  * file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.133 2011/05/13 22:15:40 christos Exp $
+ * @(#)$File: file.h,v 1.134 2011/09/16 21:23:59 christos Exp $
  */
 
 #ifndef __file_h__
@@ -405,15 +405,16 @@ protected int file_trycdf(struct magic_set *, int, const unsigned char *,
 protected int file_zmagic(struct magic_set *, int, const char *,
     const unsigned char *, size_t);
 #endif
-protected int file_ascmagic(struct magic_set *, const unsigned char *, size_t);
+protected int file_ascmagic(struct magic_set *, const unsigned char *, size_t,
+    int);
 protected int file_ascmagic_with_encoding(struct magic_set *,
     const unsigned char *, size_t, unichar *, size_t, const char *,
-    const char *);
+    const char *, int);
 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,
-    int);
+    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);
index 71257b05ccba386a2e190a84b1e9fa63f72c229c..026f472eb224cf405c37c539962ffdc581ca3856 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.56 2011/02/03 01:43:33 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.57 2011/05/11 01:02:41 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -228,7 +228,8 @@ 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, BINTEST)) != 0) {
+               if ((m = file_softmagic(ms, ubuf, nb, BINTEST,
+                   looks_text)) != 0) {
                        if ((ms->flags & MAGIC_DEBUG) != 0)
                                (void)fprintf(stderr, "softmagic %d\n", m);
 #ifdef BUILTIN_ELF
@@ -255,7 +256,7 @@ file_buffer(struct magic_set *ms, int fd, const char *inname __attribute__ ((unu
        /* try text properties (and possibly text tokens) */
        if ((ms->flags & MAGIC_NO_CHECK_TEXT) == 0) {
 
-               if ((m = file_ascmagic(ms, ubuf, nb)) != 0) {
+               if ((m = file_ascmagic(ms, ubuf, nb, looks_text)) != 0) {
                        if ((ms->flags & MAGIC_DEBUG) != 0)
                                (void)fprintf(stderr, "ascmagic %d\n", m);
                        goto done;
@@ -265,7 +266,8 @@ file_buffer(struct magic_set *ms, int fd, const char *inname __attribute__ ((unu
                if ((ms->flags & MAGIC_NO_CHECK_ENCODING) == 0) {
                        if (looks_text == 0)
                                if ((m = file_ascmagic_with_encoding( ms, ubuf,
-                                   nb, u8buf, ulen, code, type)) != 0) {
+                                   nb, u8buf, ulen, code, type, looks_text))
+                                   != 0) {
                                        if ((ms->flags & MAGIC_DEBUG) != 0)
                                                (void)fprintf(stderr,
                                                    "ascmagic/enc %d\n", m);
index f25f2e5b166496788a3452081523add37071783e..624e57203b21f6f55722313e36d920f2584a95ad 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: softmagic.c,v 1.144 2011/01/07 23:22:28 rrt Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.145 2011/05/13 22:15:40 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -43,9 +43,9 @@ FILE_RCSID("@(#)$File: softmagic.c,v 1.144 2011/01/07 23:22:28 rrt Exp $")
 
 
 private int match(struct magic_set *, struct magic *, uint32_t,
-    const unsigned char *, size_t, int);
+    const unsigned char *, size_t, int, int);
 private int mget(struct magic_set *, const unsigned char *,
-    struct magic *, size_t, unsigned int);
+    struct magic *, size_t, unsigned 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 *);
@@ -66,12 +66,14 @@ 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, int mode)
+file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes,
+    int mode, int text)
 {
        struct mlist *ml;
        int rv;
        for (ml = ms->mlist->next; ml != ms->mlist; ml = ml->next)
-               if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes, mode)) != 0)
+               if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes, mode,
+                   text)) != 0)
                        return rv;
 
        return 0;
@@ -106,7 +108,7 @@ file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes, in
  */
 private int
 match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
-    const unsigned char *s, size_t nbytes, int mode)
+    const unsigned char *s, size_t nbytes, int mode, int text)
 {
        uint32_t magindex = 0;
        unsigned int cont_level = 0;
@@ -115,6 +117,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
        int firstline = 1; /* a flag to print X\n  X\n- X */
        int printed_something = 0;
        int print = (ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0;
+       int wrong_type = 0;
 
        if (file_check_mem(ms, cont_level) == -1)
                return -1;
@@ -123,7 +126,13 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
                int flush = 0;
                struct magic *m = &magic[magindex];
 
-               if ((m->flag & mode) != mode) {
+               if (IS_STRING(m->type)) {
+                       if ((text && (m->str_flags & STRING_BINTEST)) ||
+                           (!text && m->str_flags & STRING_TEXTTEST))
+                               wrong_type = 1;
+               }
+                       
+               if (wrong_type || (m->flag & mode) != mode) {
                        /* Skip sub-tests */
                        while (magic[magindex + 1].cont_level != 0 &&
                               ++magindex < nmagic)
@@ -135,7 +144,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)) {
+               switch (mget(ms, s, m, nbytes, cont_level, text)) {
                case -1:
                        return -1;
                case 0:
@@ -218,7 +227,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
                                        continue;
                        }
 #endif
-                       switch (mget(ms, s, m, nbytes, cont_level)) {
+                       switch (mget(ms, s, m, nbytes, cont_level, text)) {
                        case -1:
                                return -1;
                        case 0:
@@ -1013,7 +1022,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)
+    struct magic *m, size_t nbytes, unsigned int cont_level, int text)
 {
        uint32_t offset = ms->offset;
        uint32_t count = m->str_range;
@@ -1578,7 +1587,7 @@ mget(struct magic_set *ms, const unsigned char *s,
                if (nbytes < offset)
                        return 0;
                return file_softmagic(ms, s + offset, nbytes - offset,
-                   BINTEST);
+                   BINTEST, text);
 
        case FILE_DEFAULT:      /* nothing to check */
        default: