commit 64a0dc2792a7e02d61fd27b4d2b39754569c4808
Author: Elan Ruusamäe <[email protected]>
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 <[email protected]>
+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

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to