[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