summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-apps/file/files/file-5.26-stdin-test.patch')
-rw-r--r--sys-apps/file/files/file-5.26-stdin-test.patch132
1 files changed, 132 insertions, 0 deletions
diff --git a/sys-apps/file/files/file-5.26-stdin-test.patch b/sys-apps/file/files/file-5.26-stdin-test.patch
new file mode 100644
index 000000000000..85e59a5dced8
--- /dev/null
+++ b/sys-apps/file/files/file-5.26-stdin-test.patch
@@ -0,0 +1,132 @@
+http://mx.gw.com/pipermail/file/2016/001963.html
+
+From 20c59ad54afc7427ea680f84c8ee5a576ba54b08 Mon Sep 17 00:00:00 2001
+From: Christos Zoulas <christos@zoulas.com>
+Date: Mon, 18 Apr 2016 15:10:34 +0000
+Subject: [PATCH] Downgrade DER comparison and offset lookup failures to be
+ handled as match failures.
+
+---
+ src/softmagic.c | 60 ++++++++++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 40 insertions(+), 20 deletions(-)
+
+diff --git a/src/softmagic.c b/src/softmagic.c
+index 14a8bc5..5b5f0f9 100644
+--- a/src/softmagic.c
++++ b/src/softmagic.c
+@@ -186,11 +186,11 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
+ ((text && (m->str_flags & FLT) == STRING_BINTEST) ||
+ (!text && (m->str_flags & FLT) == STRING_TEXTTEST))) ||
+ (m->flag & mode) != mode) {
++flush:
+ /* Skip sub-tests */
+- while (magindex + 1 < nmagic &&
+- magic[magindex + 1].cont_level != 0 &&
+- ++magindex)
+- continue;
++ while (magindex < nmagic - 1 &&
++ magic[magindex + 1].cont_level != 0)
++ magindex++;
+ continue; /* Skip to next top-level test*/
+ }
+
+@@ -227,10 +227,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
+ * main entry didn't match,
+ * flush its continuations
+ */
+- while (magindex < nmagic - 1 &&
+- magic[magindex + 1].cont_level != 0)
+- magindex++;
+- continue;
++ goto flush;
+ }
+
+ if ((e = handle_annotation(ms, m)) != 0) {
+@@ -255,8 +252,14 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
+ if (print && mprint(ms, m) == -1)
+ return -1;
+
+- if (moffset(ms, m, nbytes, &ms->c.li[cont_level].off) == -1)
++ switch (moffset(ms, m, nbytes, &ms->c.li[cont_level].off)) {
++ case -1:
+ return -1;
++ case 0:
++ goto flush;
++ default:
++ break;
++ }
+
+ /* and any continuations that match */
+ if (file_check_mem(ms, ++cont_level) == -1)
+@@ -362,9 +365,16 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
+ if (print && mprint(ms, m) == -1)
+ return -1;
+
+- if (moffset(ms, m, nbytes,
+- &ms->c.li[cont_level].off) == -1)
++ switch (moffset(ms, m, nbytes,
++ &ms->c.li[cont_level].off)) {
++ case -1:
+ return -1;
++ case 0:
++ flush = 1;
++ break;
++ default:
++ break;
++ }
+
+ if (*m->desc)
+ *need_separator = 1;
+@@ -813,9 +823,13 @@ moffset(struct magic_set *ms, struct magic *m, size_t nbytes, int32_t *op)
+ case FILE_DER:
+ {
+ o = der_offs(ms, m, nbytes);
+- if (o == -1) {
+- file_error(ms, 0, "EOF computing DER offset");
+- return -1;
++ if (o == -1 || (size_t)o > nbytes) {
++ if ((ms->flags & MAGIC_DEBUG) != 0) {
++ (void)fprintf(stderr,
++ "Bad DER offset %d nbytes=%zu",
++ o, nbytes);
++ }
++ return 0;
+ }
+ break;
+ }
+@@ -825,12 +839,13 @@ moffset(struct magic_set *ms, struct magic *m, size_t nbytes, int32_t *op)
+ break;
+ }
+
+- if ((size_t)o >= nbytes) {
+- file_error(ms, 0, "Offset out of range");
++ if ((size_t)o > nbytes) {
++ file_error(ms, 0, "Offset out of range %zu > %zu",
++ (size_t)o, nbytes);
+ return -1;
+ }
+ *op = o;
+- return 0;
++ return 1;
+ }
+
+ private uint32_t
+@@ -2107,8 +2122,13 @@ magiccheck(struct magic_set *ms, struct magic *m)
+ return 1;
+ case FILE_DER:
+ matched = der_cmp(ms, m);
+- if (matched == -1)
+- file_error(ms, 0, "EOF comparing DER entries");
++ if (matched == -1) {
++ if ((ms->flags & MAGIC_DEBUG) != 0) {
++ (void) fprintf(stderr,
++ "EOF comparing DER entries");
++ }
++ return 0;
++ }
+ return matched;
+ default:
+ file_magerror(ms, "invalid type %d in magiccheck()", m->type);
+--
+2.7.4
+