]> git.pld-linux.org Git - packages/file.git/commitdiff
upstream fix for offset errors
authorElan Ruusamäe <glen@delfi.ee>
Mon, 18 Apr 2016 20:34:36 +0000 (23:34 +0300)
committerElan Ruusamäe <glen@delfi.ee>
Mon, 18 Apr 2016 20:34:36 +0000 (23:34 +0300)
file.spec
offset.patch [new file with mode: 0644]

index 7037547338a6ff024a156041b4662fe071d48050..da1f1d22b1a231e9455e45b694b5fa4aeb0e2fd4 100644 (file)
--- 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 (file)
index 0000000..1a38eaf
--- /dev/null
@@ -0,0 +1,124 @@
+commit 20c59ad54afc7427ea680f84c8ee5a576ba54b08
+Author: Christos Zoulas <christos@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);
This page took 0.137161 seconds and 4 git commands to generate.