You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.9 KiB
84 lines
2.9 KiB
diff --git a/src/softmagic.c b/src/softmagic.c |
|
index f848f94..ee979b9 100644 |
|
--- a/src/softmagic.c |
|
+++ b/src/softmagic.c |
|
@@ -50,7 +50,7 @@ private int32_t mprint(struct magic_set *, struct magic *); |
|
private int32_t moffset(struct magic_set *, struct magic *); |
|
private void mdebug(uint32_t, const char *, size_t); |
|
private int mcopy(struct magic_set *, union VALUETYPE *, int, int, |
|
- const unsigned char *, uint32_t, size_t, size_t); |
|
+ const unsigned char *, uint32_t, size_t, struct magic *); |
|
private int mconvert(struct magic_set *, struct magic *); |
|
private int print_sep(struct magic_set *, int); |
|
private int handle_annotation(struct magic_set *, struct magic *); |
|
@@ -936,7 +936,7 @@ mdebug(uint32_t offset, const char *str, size_t len) |
|
|
|
private int |
|
mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, |
|
- const unsigned char *s, uint32_t offset, size_t nbytes, size_t linecnt) |
|
+ const unsigned char *s, uint32_t offset, size_t nbytes, struct magic *m) |
|
{ |
|
/* |
|
* Note: FILE_SEARCH and FILE_REGEX do not actually copy |
|
@@ -956,15 +956,24 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, |
|
const char *last; /* end of search region */ |
|
const char *buf; /* start of search region */ |
|
const char *end; |
|
- size_t lines; |
|
+ size_t lines, linecnt, bytecnt; |
|
|
|
+ linecnt = m->str_range; |
|
+ bytecnt = linecnt * 80; |
|
+ |
|
+ if (bytecnt == 0) { |
|
+ bytecnt = 8192; |
|
+ } |
|
+ if (bytecnt > nbytes) { |
|
+ bytecnt = nbytes; |
|
+ } |
|
if (s == NULL) { |
|
ms->search.s_len = 0; |
|
ms->search.s = NULL; |
|
return 0; |
|
} |
|
buf = RCAST(const char *, s) + offset; |
|
- end = last = RCAST(const char *, s) + nbytes; |
|
+ end = last = RCAST(const char *, s) + bytecnt; |
|
/* mget() guarantees buf <= last */ |
|
for (lines = linecnt, b = buf; lines && b < end && |
|
((b = CAST(const char *, |
|
@@ -977,7 +986,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir, |
|
b++; |
|
} |
|
if (lines) |
|
- last = RCAST(const char *, s) + nbytes; |
|
+ last = RCAST(const char *, s) + bytecnt; |
|
|
|
ms->search.s = buf; |
|
ms->search.s_len = last - buf; |
|
@@ -1050,7 +1059,6 @@ mget(struct magic_set *ms, const unsigned char *s, |
|
int recursion_level) |
|
{ |
|
uint32_t offset = ms->offset; |
|
- uint32_t count = m->str_range; |
|
union VALUETYPE *p = &ms->ms_value; |
|
|
|
if (recursion_level >= 20) { |
|
@@ -1058,7 +1066,7 @@ mget(struct magic_set *ms, const unsigned char *s, |
|
return -1; |
|
} |
|
|
|
- if (mcopy(ms, p, m->type, m->flag & INDIR, s, offset, nbytes, count) == -1) |
|
+ if (mcopy(ms, p, m->type, m->flag & INDIR, s, offset, (uint32_t)nbytes, m) == -1) |
|
return -1; |
|
|
|
if ((ms->flags & MAGIC_DEBUG) != 0) { |
|
@@ -1546,7 +1554,7 @@ mget(struct magic_set *ms, const unsigned char *s, |
|
if (m->flag & INDIROFFADD) { |
|
offset += ms->c.li[cont_level-1].off; |
|
} |
|
- if (mcopy(ms, p, m->type, 0, s, offset, nbytes, count) == -1) |
|
+ if (mcopy(ms, p, m->type, 0, s, offset, nbytes, m) == -1) |
|
return -1; |
|
ms->offset = offset; |
|
|
|
|