From 64a0dc2792a7e02d61fd27b4d2b39754569c4808 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Elan=20Ruusam=C3=A4e?= Date: Mon, 18 Apr 2016 23:34:36 +0300 Subject: [PATCH] upstream fix for offset errors --- file.spec | 4 +- offset.patch | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 offset.patch diff --git a/file.spec b/file.spec index 7037547..da1f1d2 100644 --- a/file.spec +++ b/file.spec @@ -30,7 +30,7 @@ Summary(zh_CN.UTF-8): 判定文件类型的工具。 Summary(zh_TW.UTF-8): 用於決定檔案類型的一個工具程式。 Name: file Version: 5.26 -Release: 1.8 +Release: 2 License: distributable Group: Applications/File Source0: ftp://ftp.astron.com/pub/file/%{name}-%{version}.tar.gz @@ -46,6 +46,7 @@ Patch2: automake.patch Patch4: name-use-count.patch Patch5: 001949.patch Patch6: revert-close.patch +Patch7: offset.patch URL: http://www.darwinsys.com/file/ BuildRequires: autoconf >= 2.50 BuildRequires: automake @@ -274,6 +275,7 @@ Wiązania Pythona 3 do biblioteki libmagic. %patch4 -p1 %patch5 -p0 -d magic/Magdir %patch6 -p1 -R +%patch7 -p1 %if "%{cc_version}" < "3.4" %{__sed} -i -e 's,-Wextra,,' configure.ac diff --git a/offset.patch b/offset.patch new file mode 100644 index 0000000..1a38eaf --- /dev/null +++ b/offset.patch @@ -0,0 +1,124 @@ +commit 20c59ad54afc7427ea680f84c8ee5a576ba54b08 +Author: Christos Zoulas +Date: Mon Apr 18 15:10:34 2016 +0000 + + Downgrade DER comparison and offset lookup failures to be handled as match + failures. + +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.43.0