|
@@ -1,39 +1,95 @@
|
|
|
-made apply cleanly based on the following commits:
|
|
|
-
|
|
|
-commit 27a14bc7ba285a0a5ebfdb55e54001aa11932b08
|
|
|
+Subject: Buffer overflow in the mconvert function allows remote attackers to cause a denial of service
|
|
|
+ID: CVE-2014-3478
|
|
|
Author: Christos Zoulas <christos@zoulas.com>
|
|
|
-Date: Wed Jun 4 17:36:34 2014 +0000
|
|
|
+Date:
|
|
|
+ Wed Jun 4 17:36:34 2014 +0000 (A)
|
|
|
+ Wed Dec 22 18:14:05 2010 +0000 (B)
|
|
|
+ Wed Dec 22 19:09:10 2010 +0000 (C)
|
|
|
+Origin:
|
|
|
+ commit 27a14bc7ba285a0a5ebfdb55e54001aa11932b08 (A)
|
|
|
+ commit 2f0eeb07ba633f1d915f78a50b22808123b38ea0 (B)
|
|
|
+ commit 57e4574e062e538b16b225e822ece6ca0ce539b8 (C)
|
|
|
+Debian-Author: Holger Levsen <holger@debian.org>
|
|
|
+Comment:
|
|
|
+ made apply cleanly based on the [above] commits
|
|
|
+Reviewed-By: Christoph Biedl <debian.axhn@manchmal.in-ulm.de>
|
|
|
+Last-Update: 2014-09-07
|
|
|
|
|
|
+ [ A: ]
|
|
|
Correctly compute the truncated pascal string size (Francisco Alonso and
|
|
|
Jan Kaluza at RedHat)
|
|
|
|
|
|
-commit 2f0eeb07ba633f1d915f78a50b22808123b38ea0
|
|
|
-Author: Christos Zoulas <christos@zoulas.com>
|
|
|
-Date: Wed Dec 22 18:14:05 2010 +0000
|
|
|
-
|
|
|
+ [ B: ]
|
|
|
support for various formats of pascal strings.
|
|
|
|
|
|
-commit 57e4574e062e538b16b225e822ece6ca0ce539b8
|
|
|
-Author: Christos Zoulas <christos@zoulas.com>
|
|
|
-Date: Wed Dec 22 19:09:10 2010 +0000
|
|
|
-
|
|
|
+ [ C: ]
|
|
|
don't undo our initialization
|
|
|
|
|
|
-diff --git a/src/softmagic.c b/src/softmagic.c
|
|
|
-index 9ba500b..6d69419 100644
|
|
|
--- a/src/softmagic.c
|
|
|
+++ b/src/softmagic.c
|
|
|
-@@ -800,10 +800,18 @@ mconvert(struct magic_set *ms, struct magic *m, int flip)
|
|
|
+@@ -169,6 +169,8 @@
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
++ if ((e = handle_annotation(ms, m)) != 0)
|
|
|
++ return e;
|
|
|
+ /*
|
|
|
+ * If we are going to print something, we'll need to print
|
|
|
+ * a blank before we print something else.
|
|
|
+@@ -176,8 +178,6 @@
|
|
|
+ if (*m->desc) {
|
|
|
+ need_separator = 1;
|
|
|
+ printed_something = 1;
|
|
|
+- if ((e = handle_annotation(ms, m)) != 0)
|
|
|
+- return e;
|
|
|
+ if (print_sep(ms, firstline) == -1)
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+@@ -252,13 +252,13 @@
|
|
|
+ ms->c.li[cont_level].got_match = 0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
++ if ((e = handle_annotation(ms, m)) != 0)
|
|
|
++ return e;
|
|
|
+ /*
|
|
|
+ * If we are going to print something,
|
|
|
+ * make sure that we have a separator first.
|
|
|
+ */
|
|
|
+ if (*m->desc) {
|
|
|
+- if ((e = handle_annotation(ms, m)) != 0)
|
|
|
+- return e;
|
|
|
+ if (!printed_something) {
|
|
|
+ printed_something = 1;
|
|
|
+ if (print_sep(ms, firstline)
|
|
|
+@@ -450,7 +450,7 @@
|
|
|
+ return -1;
|
|
|
+ t = ms->offset + strlen(p->s);
|
|
|
+ if (m->type == FILE_PSTRING)
|
|
|
+- t++;
|
|
|
++ t += file_pstring_length_size(m);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+@@ -615,7 +615,7 @@
|
|
|
+ p->s[strcspn(p->s, "\n")] = '\0';
|
|
|
+ t = CAST(uint32_t, (ms->offset + strlen(p->s)));
|
|
|
+ if (m->type == FILE_PSTRING)
|
|
|
+- t++;
|
|
|
++ t += file_pstring_length_size(m);
|
|
|
+ return t;
|
|
|
+ }
|
|
|
+
|
|
|
+@@ -800,10 +800,18 @@
|
|
|
return 1;
|
|
|
}
|
|
|
case FILE_PSTRING: {
|
|
|
- char *ptr1 = p->s, *ptr2 = ptr1 + 1;
|
|
|
- size_t len = *p->s;
|
|
|
+- if (len >= sizeof(p->s))
|
|
|
+- len = sizeof(p->s) - 1;
|
|
|
+ size_t sz = file_pstring_length_size(m);
|
|
|
+ char *ptr1 = p->s, *ptr2 = ptr1 + sz;
|
|
|
+ size_t len = file_pstring_get_length(m, ptr1);
|
|
|
-- if (len >= sizeof(p->s))
|
|
|
-- len = sizeof(p->s) - 1;
|
|
|
+ if (len >= sizeof(p->s)) {
|
|
|
+ /*
|
|
|
+ * The size of the pascal string length (sz)
|
|
@@ -46,11 +102,9 @@ index 9ba500b..6d69419 100644
|
|
|
while (len--)
|
|
|
*ptr1++ = *ptr2++;
|
|
|
*ptr1 = '\0';
|
|
|
-diff --git a/doc/magic.man b/doc/magic.man
|
|
|
-index 8486645..299bb8d 100644
|
|
|
--- a/doc/magic.man
|
|
|
+++ b/doc/magic.man
|
|
|
-@@ -71,8 +71,22 @@ characters in the magic match both lower and upper case characters in the
|
|
|
+@@ -71,8 +71,22 @@
|
|
|
target, whereas upper case characters in the magic only match uppercase
|
|
|
characters in the target.
|
|
|
.It Dv pstring
|
|
@@ -74,11 +128,9 @@ index 8486645..299bb8d 100644
|
|
|
The string is not NUL terminated.
|
|
|
.It Dv date
|
|
|
A four-byte value interpreted as a UNIX date.
|
|
|
-diff --git a/src/apprentice.c b/src/apprentice.c
|
|
|
-index 40d547b..1120a69 100644
|
|
|
--- a/src/apprentice.c
|
|
|
+++ b/src/apprentice.c
|
|
|
-@@ -932,6 +932,11 @@ string_modifier_check(struct magic_set *ms, struct magic *m)
|
|
|
+@@ -932,6 +932,11 @@
|
|
|
if ((ms->flags & MAGIC_CHECK) == 0)
|
|
|
return 0;
|
|
|
|
|
@@ -90,16 +142,17 @@ index 40d547b..1120a69 100644
|
|
|
switch (m->type) {
|
|
|
case FILE_BESTRING16:
|
|
|
case FILE_LESTRING16:
|
|
|
-@@ -1308,7 +1308,7 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
|
|
|
+@@ -1308,8 +1313,7 @@
|
|
|
++l;
|
|
|
}
|
|
|
m->str_range = 0;
|
|
|
- m->str_flags = 0;
|
|
|
+- m->num_mask = 0;
|
|
|
+ m->str_flags = m->type == FILE_PSTRING ? PSTRING_1_LE : 0;
|
|
|
- m->num_mask = 0;
|
|
|
if ((op = get_op(*l)) != -1) {
|
|
|
if (!IS_STRING(m->type)) {
|
|
|
-@@ -1362,6 +1362,32 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
|
|
|
+ uint64_t val;
|
|
|
+@@ -1362,6 +1366,32 @@
|
|
|
case CHAR_TEXTTEST:
|
|
|
m->str_flags |= STRING_TEXTTEST;
|
|
|
break;
|
|
@@ -132,7 +185,7 @@ index 40d547b..1120a69 100644
|
|
|
default:
|
|
|
if (ms->flags & MAGIC_CHECK)
|
|
|
file_magwarn(ms,
|
|
|
-@@ -1990,7 +1990,7 @@ out:
|
|
|
+@@ -1990,7 +2020,7 @@
|
|
|
*p = '\0';
|
|
|
m->vallen = CAST(unsigned char, (p - origp));
|
|
|
if (m->type == FILE_PSTRING)
|
|
@@ -141,7 +194,16 @@ index 40d547b..1120a69 100644
|
|
|
return s;
|
|
|
}
|
|
|
|
|
|
-@@ -2379,3 +2379,40 @@ bs1(struct magic *m)
|
|
|
+@@ -2371,6 +2401,8 @@
|
|
|
+ m->in_offset = swap4((uint32_t)m->in_offset);
|
|
|
+ m->lineno = swap4((uint32_t)m->lineno);
|
|
|
+ if (IS_STRING(m->type)) {
|
|
|
++ if (m->type == FILE_PSTRING)
|
|
|
++ printf("flags! %d\n", m->str_flags);
|
|
|
+ m->str_range = swap4(m->str_range);
|
|
|
+ m->str_flags = swap4(m->str_flags);
|
|
|
+ }
|
|
|
+@@ -2379,3 +2411,40 @@
|
|
|
m->num_mask = swap8(m->num_mask);
|
|
|
}
|
|
|
}
|
|
@@ -182,11 +244,9 @@ index 40d547b..1120a69 100644
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+}
|
|
|
-diff --git a/src/file.h b/src/file.h
|
|
|
-index 25cd3a5..c84749f 100644
|
|
|
--- a/src/file.h
|
|
|
+++ b/src/file.h
|
|
|
-@@ -285,6 +285,14 @@ struct magic {
|
|
|
+@@ -285,6 +285,14 @@
|
|
|
#define REGEX_OFFSET_START BIT(4)
|
|
|
#define STRING_TEXTTEST BIT(5)
|
|
|
#define STRING_BINTEST BIT(6)
|
|
@@ -201,7 +261,7 @@ index 25cd3a5..c84749f 100644
|
|
|
#define CHAR_COMPACT_WHITESPACE 'W'
|
|
|
#define CHAR_COMPACT_OPTIONAL_WHITESPACE 'w'
|
|
|
#define CHAR_IGNORE_LOWERCASE 'c'
|
|
|
-@@ -292,6 +292,12 @@ struct magic {
|
|
|
+@@ -292,6 +300,12 @@
|
|
|
#define CHAR_REGEX_OFFSET_START 's'
|
|
|
#define CHAR_TEXTTEST 't'
|
|
|
#define CHAR_BINTEST 'b'
|
|
@@ -214,7 +274,7 @@ index 25cd3a5..c84749f 100644
|
|
|
#define STRING_IGNORE_CASE (STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
|
|
|
#define STRING_DEFAULT_RANGE 100
|
|
|
|
|
|
-@@ -400,6 +400,8 @@ protected ssize_t sread(int, void *, size_t, int);
|
|
|
+@@ -400,6 +414,8 @@
|
|
|
protected int file_check_mem(struct magic_set *, unsigned int);
|
|
|
protected int file_looks_utf8(const unsigned char *, size_t, unichar *,
|
|
|
size_t *);
|
|
@@ -223,80 +283,3 @@ index 25cd3a5..c84749f 100644
|
|
|
#ifdef __EMX__
|
|
|
protected int file_os2_apptype(struct magic_set *, const char *, const void *,
|
|
|
size_t);
|
|
|
-diff --git a/src/softmagic.c b/src/softmagic.c
|
|
|
-index a565989..0f15227 100644
|
|
|
---- a/src/softmagic.c
|
|
|
-+++ b/src/softmagic.c
|
|
|
-@@ -169,6 +169,8 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
-+ if ((e = handle_annotation(ms, m)) != 0)
|
|
|
-+ return e;
|
|
|
- /*
|
|
|
- * If we are going to print something, we'll need to print
|
|
|
- * a blank before we print something else.
|
|
|
-@@ -176,8 +176,6 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
|
|
|
- if (*m->desc) {
|
|
|
- need_separator = 1;
|
|
|
- printed_something = 1;
|
|
|
-- if ((e = handle_annotation(ms, m)) != 0)
|
|
|
-- return e;
|
|
|
- if (print_sep(ms, firstline) == -1)
|
|
|
- return -1;
|
|
|
- }
|
|
|
-@@ -252,13 +252,13 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
|
|
|
- ms->c.li[cont_level].got_match = 0;
|
|
|
- break;
|
|
|
- }
|
|
|
-+ if ((e = handle_annotation(ms, m)) != 0)
|
|
|
-+ return e;
|
|
|
- /*
|
|
|
- * If we are going to print something,
|
|
|
- * make sure that we have a separator first.
|
|
|
- */
|
|
|
- if (*m->desc) {
|
|
|
-- if ((e = handle_annotation(ms, m)) != 0)
|
|
|
-- return e;
|
|
|
- if (!printed_something) {
|
|
|
- printed_something = 1;
|
|
|
- if (print_sep(ms, firstline)
|
|
|
-@@ -450,7 +450,7 @@ mprint(struct magic_set *ms, struct magic *m)
|
|
|
- return -1;
|
|
|
- t = ms->offset + strlen(p->s);
|
|
|
- if (m->type == FILE_PSTRING)
|
|
|
-- t++;
|
|
|
-+ t += file_pstring_length_size(m);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
-@@ -615,7 +615,7 @@ moffset(struct magic_set *ms, struct magic *m)
|
|
|
- p->s[strcspn(p->s, "\n")] = '\0';
|
|
|
- t = CAST(uint32_t, (ms->offset + strlen(p->s)));
|
|
|
- if (m->type == FILE_PSTRING)
|
|
|
-- t++;
|
|
|
-+ t += file_pstring_length_size(m);
|
|
|
- return t;
|
|
|
- }
|
|
|
-
|
|
|
-diff --git a/src/apprentice.c b/src/apprentice.c
|
|
|
-index 1120a69..c77f679 100644
|
|
|
---- a/src/apprentice.c
|
|
|
-+++ b/src/apprentice.c
|
|
|
-@@ -1314,7 +1314,6 @@ parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp,
|
|
|
- }
|
|
|
- m->str_range = 0;
|
|
|
- m->str_flags = m->type == FILE_PSTRING ? PSTRING_1_LE : 0;
|
|
|
-- m->num_mask = 0;
|
|
|
- if ((op = get_op(*l)) != -1) {
|
|
|
- if (!IS_STRING(m->type)) {
|
|
|
- uint64_t val;
|
|
|
-@@ -2402,6 +2402,8 @@ bs1(struct magic *m)
|
|
|
- m->in_offset = swap4((uint32_t)m->in_offset);
|
|
|
- m->lineno = swap4((uint32_t)m->lineno);
|
|
|
- if (IS_STRING(m->type)) {
|
|
|
-+ if (m->type == FILE_PSTRING)
|
|
|
-+ printf("flags! %d\n", m->str_flags);
|
|
|
- m->str_range = swap4(m->str_range);
|
|
|
- m->str_flags = swap4(m->str_flags);
|
|
|
- }
|