[packages/file] upstream fix for offset errors
glen
glen at pld-linux.org
Mon Apr 18 22:34:54 CEST 2016
commit 64a0dc2792a7e02d61fd27b4d2b39754569c4808
Author: Elan Ruusamäe <glen at delfi.ee>
Date: Mon Apr 18 23:34:36 2016 +0300
upstream fix for offset errors
file.spec | 4 +-
offset.patch | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 127 insertions(+), 1 deletion(-)
---
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 <christos at zoulas.com>
+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);
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/file.git/commitdiff/64a0dc2792a7e02d61fd27b4d2b39754569c4808
More information about the pld-cvs-commit
mailing list