|
|
fa5e7e |
diff --git a/src/softmagic.c b/src/softmagic.c
|
|
|
fa5e7e |
index 56f09ee..8d08cad 100644
|
|
|
fa5e7e |
--- a/src/softmagic.c
|
|
|
fa5e7e |
+++ b/src/softmagic.c
|
|
|
fa5e7e |
@@ -61,6 +61,7 @@ private void cvt_16(union VALUETYPE *, const struct magic *);
|
|
|
fa5e7e |
private void cvt_32(union VALUETYPE *, const struct magic *);
|
|
|
fa5e7e |
private void cvt_64(union VALUETYPE *, const struct magic *);
|
|
|
fa5e7e |
|
|
|
fa5e7e |
+#define OFFSET_OOB(n, o, i) ((n) < (o) || (i) > ((n) - (o)))
|
|
|
fa5e7e |
/*
|
|
|
fa5e7e |
* softmagic - lookup one file in parsed, in-memory copy of database
|
|
|
fa5e7e |
* Passed the name and FILE * of one file to be typed.
|
|
|
fa5e7e |
@@ -1081,7 +1082,7 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
}
|
|
|
fa5e7e |
switch (m->in_type) {
|
|
|
fa5e7e |
case FILE_BYTE:
|
|
|
fa5e7e |
- if (nbytes < (offset + 1))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 1))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1116,7 +1117,8 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
offset = ~offset;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
case FILE_BESHORT:
|
|
|
fa5e7e |
- if (nbytes < (offset + 2))
|
|
|
fa5e7e |
+
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 2))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1168,7 +1170,7 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
offset = ~offset;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
case FILE_LESHORT:
|
|
|
fa5e7e |
- if (nbytes < (offset + 2))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 2))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1220,7 +1222,7 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
offset = ~offset;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
case FILE_SHORT:
|
|
|
fa5e7e |
- if (nbytes < (offset + 2))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 2))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1257,7 +1259,7 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
case FILE_BELONG:
|
|
|
fa5e7e |
case FILE_BEID3:
|
|
|
fa5e7e |
- if (nbytes < (offset + 4))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 4))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1328,7 +1330,7 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
case FILE_LELONG:
|
|
|
fa5e7e |
case FILE_LEID3:
|
|
|
fa5e7e |
- if (nbytes < (offset + 4))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 4))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1398,7 +1400,7 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
offset = ~offset;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
case FILE_MELONG:
|
|
|
fa5e7e |
- if (nbytes < (offset + 4))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 4))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1468,7 +1470,7 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
offset = ~offset;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
case FILE_LONG:
|
|
|
fa5e7e |
- if (nbytes < (offset + 4))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 4))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
if (off) {
|
|
|
fa5e7e |
switch (m->in_op & FILE_OPS_MASK) {
|
|
|
fa5e7e |
@@ -1535,14 +1537,14 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
/* Verify we have enough data to match magic type */
|
|
|
fa5e7e |
switch (m->type) {
|
|
|
fa5e7e |
case FILE_BYTE:
|
|
|
fa5e7e |
- if (nbytes < (offset + 1)) /* should alway be true */
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 1))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
|
|
|
fa5e7e |
case FILE_SHORT:
|
|
|
fa5e7e |
case FILE_BESHORT:
|
|
|
fa5e7e |
case FILE_LESHORT:
|
|
|
fa5e7e |
- if (nbytes < (offset + 2))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 2))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
|
|
|
fa5e7e |
@@ -1561,26 +1563,26 @@ mget(struct magic_set *ms, const unsigned char *s,
|
|
|
fa5e7e |
case FILE_FLOAT:
|
|
|
fa5e7e |
case FILE_BEFLOAT:
|
|
|
fa5e7e |
case FILE_LEFLOAT:
|
|
|
fa5e7e |
- if (nbytes < (offset + 4))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 4))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
|
|
|
fa5e7e |
case FILE_DOUBLE:
|
|
|
fa5e7e |
case FILE_BEDOUBLE:
|
|
|
fa5e7e |
case FILE_LEDOUBLE:
|
|
|
fa5e7e |
- if (nbytes < (offset + 8))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 8))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
|
|
|
fa5e7e |
case FILE_STRING:
|
|
|
fa5e7e |
case FILE_PSTRING:
|
|
|
fa5e7e |
case FILE_SEARCH:
|
|
|
fa5e7e |
- if (nbytes < (offset + m->vallen))
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, m->vallen))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
|
|
|
fa5e7e |
case FILE_REGEX:
|
|
|
fa5e7e |
- if (nbytes < offset)
|
|
|
fa5e7e |
+ if (OFFSET_OOB(nbytes, offset, 0))
|
|
|
fa5e7e |
return 0;
|
|
|
fa5e7e |
break;
|
|
|
fa5e7e |
|