diff options
Diffstat (limited to 'src/softmagic.c')
| -rw-r--r-- | src/softmagic.c | 56 | 
1 files changed, 37 insertions, 19 deletions
| diff --git a/src/softmagic.c b/src/softmagic.c index 00d5aac6000f..9a5db9d3e2b3 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.259 2018/03/11 01:23:52 christos Exp $") +FILE_RCSID("@(#)$File: softmagic.c,v 1.262 2018/06/22 20:39:50 christos Exp $")  #endif	/* lint */  #include "magic.h" @@ -53,8 +53,7 @@ private int mget(struct magic_set *, struct magic *, const struct buffer *,  private int msetoffset(struct magic_set *, struct magic *, struct buffer *,      const struct buffer *, size_t, unsigned int);  private int magiccheck(struct magic_set *, struct magic *); -private int32_t mprint(struct magic_set *, struct magic *, -    const struct buffer *); +private int32_t mprint(struct magic_set *, struct magic *);  private int moffset(struct magic_set *, struct magic *, const struct buffer *,      int32_t *);  private void mdebug(uint32_t, const char *, size_t); @@ -62,8 +61,7 @@ private int mcopy(struct magic_set *, union VALUETYPE *, int, int,      const unsigned char *, uint32_t, size_t, struct magic *);  private int mconvert(struct magic_set *, struct magic *, int);  private int print_sep(struct magic_set *, int); -private int handle_annotation(struct magic_set *, struct magic *, -    const struct buffer *, int); +private int handle_annotation(struct magic_set *, struct magic *, int);  private int cvt_8(union VALUETYPE *, const struct magic *);  private int cvt_16(union VALUETYPE *, const struct magic *);  private int cvt_32(union VALUETYPE *, const struct magic *); @@ -240,7 +238,7 @@ flush:  			goto flush;  		} -		if ((e = handle_annotation(ms, m, b, firstline)) != 0) { +		if ((e = handle_annotation(ms, m, firstline)) != 0) {  			*need_separator = 1;  			*printed_something = 1;  			*returnval = 1; @@ -258,7 +256,7 @@ flush:  				return -1;  		} -		if (print && mprint(ms, m, b) == -1) +		if (print && mprint(ms, m) == -1)  			return -1;  		switch (moffset(ms, m, &bb, &ms->c.li[cont_level].off)) { @@ -339,7 +337,7 @@ flush:  				} else  					ms->c.li[cont_level].got_match = 1; -				if ((e = handle_annotation(ms, m, b, firstline)) +				if ((e = handle_annotation(ms, m, firstline))  				    != 0) {  					*need_separator = 1;  					*printed_something = 1; @@ -373,7 +371,7 @@ flush:  						return -1;  					*need_separator = 0;  				} -				if (print && mprint(ms, m, b) == -1) +				if (print && mprint(ms, m) == -1)  					return -1;  				switch (moffset(ms, m, &bb, @@ -433,8 +431,11 @@ check_fmt(struct magic_set *ms, const char *fmt)  	return rv;  } -#ifndef HAVE_STRNDUP -char * strndup(const char *, size_t); +#if !defined(HAVE_STRNDUP) || defined(__aiws__) +# ifdef __aiws__ +#  define strndup aix_strndup	/* aix is broken */ +# endif +char *strndup(const char *, size_t);  char *  strndup(const char *str, size_t n) @@ -453,7 +454,7 @@ strndup(const char *str, size_t n)  #endif /* HAVE_STRNDUP */  static int -varexpand(char *buf, size_t len, const struct buffer *b, const char *str) +varexpand(struct magic_set *ms, char *buf, size_t len, const char *str)  {  	const char *ptr, *sptr, *e, *t, *ee, *et;  	size_t l; @@ -478,7 +479,7 @@ varexpand(char *buf, size_t len, const struct buffer *b, const char *str)  			return -1;  		switch (*ptr) {  		case 'x': -			if (b->st.st_mode & 0111) { +			if (ms->mode & 0111) {  				ptr = t;  				l = et - t;  			} else { @@ -508,7 +509,7 @@ varexpand(char *buf, size_t len, const struct buffer *b, const char *str)  private int32_t -mprint(struct magic_set *ms, struct magic *m, const struct buffer *b) +mprint(struct magic_set *ms, struct magic *m)  {  	uint64_t v;  	float vf; @@ -518,7 +519,7 @@ mprint(struct magic_set *ms, struct magic *m, const struct buffer *b)  	const char *desc;  	union VALUETYPE *p = &ms->ms_value; -	if (varexpand(ebuf, sizeof(ebuf), b, m->desc) == -1) +	if (varexpand(ms, ebuf, sizeof(ebuf), m->desc) == -1)  		desc = m->desc;  	else  		desc = ebuf; @@ -1534,6 +1535,14 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,  			case FILE_MELONG:  				off = SEXT(sgn,32,ME32(q));  				break; +			case FILE_BEQUAD: +				off = SEXT(sgn,64,BE64(q)); +				break; +			case FILE_LEQUAD: +				off = SEXT(sgn,64,LE64(q)); +				break; +			default: +				abort();  			}  			if ((ms->flags & MAGIC_DEBUG) != 0)  				fprintf(stderr, "indirect offs=%jd\n", off); @@ -1587,8 +1596,18 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,  				return 0;  			offset = do_ops(m, SEXT(sgn,32,p->l), off);  			break; -		default: +		case FILE_LEQUAD: +			if (OFFSET_OOB(nbytes, offset, 8)) +				return 0; +			offset = do_ops(m, SEXT(sgn,64,LE64(p)), off); +			break; +		case FILE_BEQUAD: +			if (OFFSET_OOB(nbytes, offset, 8)) +				return 0; +			offset = do_ops(m, SEXT(sgn,64,BE64(p)), off);  			break; +		default: +			abort();  		}  		if (m->flag & INDIROFFADD) { @@ -2159,8 +2178,7 @@ magiccheck(struct magic_set *ms, struct magic *m)  }  private int -handle_annotation(struct magic_set *ms, struct magic *m, const struct buffer *b, -    int firstline) +handle_annotation(struct magic_set *ms, struct magic *m, int firstline)  {  	if ((ms->flags & MAGIC_APPLE) && m->apple[0]) {  		if (!firstline && file_printf(ms, "\n- ") == -1) @@ -2181,7 +2199,7 @@ handle_annotation(struct magic_set *ms, struct magic *m, const struct buffer *b,  		const char *p;  		if (!firstline && file_printf(ms, "\n- ") == -1)  			return -1; -		if (varexpand(buf, sizeof(buf), b, m->mimetype) == -1) +		if (varexpand(ms, buf, sizeof(buf), m->mimetype) == -1)  			p = m->mimetype;  		else  			p = buf; | 
