mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
6.4 KiB

  1. # --- ROCK-COPYRIGHT-NOTE-BEGIN ---
  2. #
  3. # This copyright note is auto-generated by ./scripts/Create-CopyPatch.
  4. # Please add additional copyright information _after_ the line containing
  5. # the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by
  6. # the ./scripts/Create-CopyPatch script. Do not edit this copyright text!
  7. #
  8. # ROCK Linux: rock-src/package/rene/xpdf/xpdf-3.00pl1-overflowfix.patch.xpdf
  9. # ROCK Linux is Copyright (C) 1998 - 2005 Clifford Wolf
  10. #
  11. # This patch file is dual-licensed. It is available under the license the
  12. # patched project is licensed under, as long as it is an OpenSource license
  13. # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms
  14. # of the GNU General Public License as published by the Free Software
  15. # Foundation; either version 2 of the License, or (at your option) any later
  16. # version.
  17. #
  18. # --- ROCK-COPYRIGHT-NOTE-END ---
  19. --- ./xpdf/XRef.cc.orig 2004-11-24 15:01:16.444656632 +0100
  20. +++ ./xpdf/XRef.cc 2004-11-24 15:00:57.007611512 +0100
  21. @@ -96,7 +96,7 @@
  22. }
  23. nObjects = obj1.getInt();
  24. obj1.free();
  25. - if (nObjects == 0) {
  26. + if (nObjects <= 0) {
  27. goto err1;
  28. }
  29. @@ -106,6 +106,9 @@
  30. }
  31. first = obj1.getInt();
  32. obj1.free();
  33. + if (first < 0) {
  34. + goto err1;
  35. + }
  36. objs = new Object[nObjects];
  37. objNums = (int *)gmalloc(nObjects * sizeof(int));
  38. @@ -130,6 +133,12 @@
  39. offsets[i] = obj2.getInt();
  40. obj1.free();
  41. obj2.free();
  42. + if (objNums[i] < 0 || offsets[i] < 0 ||
  43. + (i > 0 && offsets[i] < offsets[i-1])) {
  44. + delete parser;
  45. + gfree(offsets);
  46. + goto err1;
  47. + }
  48. }
  49. while (str->getChar() != EOF) ;
  50. delete parser;
  51. @@ -369,10 +378,16 @@
  52. }
  53. n = obj.getInt();
  54. obj.free();
  55. + if (first < 0 || n < 0 || first + n < 0) {
  56. + goto err1;
  57. + }
  58. if (first + n > size) {
  59. for (newSize = size ? 2 * size : 1024;
  60. - first + n > newSize;
  61. + first + n > newSize && newSize > 0;
  62. newSize <<= 1) ;
  63. + if (newSize < 0) {
  64. + goto err1;
  65. + }
  66. entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
  67. for (i = size; i < newSize; ++i) {
  68. entries[i].offset = 0xffffffff;
  69. @@ -443,7 +458,7 @@
  70. // check for an 'XRefStm' key
  71. if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) {
  72. - pos2 = obj2.getInt();
  73. + pos2 = (Guint)obj2.getInt();
  74. readXRef(&pos2);
  75. if (!ok) {
  76. goto err1;
  77. @@ -474,6 +489,9 @@
  78. }
  79. newSize = obj.getInt();
  80. obj.free();
  81. + if (newSize < 0) {
  82. + goto err1;
  83. + }
  84. if (newSize > size) {
  85. entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
  86. for (i = size; i < newSize; ++i) {
  87. @@ -494,6 +512,9 @@
  88. }
  89. w[i] = obj2.getInt();
  90. obj2.free();
  91. + if (w[i] < 0 || w[i] > 4) {
  92. + goto err1;
  93. + }
  94. }
  95. obj.free();
  96. @@ -513,13 +534,14 @@
  97. }
  98. n = obj.getInt();
  99. obj.free();
  100. - if (!readXRefStreamSection(xrefStr, w, first, n)) {
  101. + if (first < 0 || n < 0 ||
  102. + !readXRefStreamSection(xrefStr, w, first, n)) {
  103. idx.free();
  104. goto err0;
  105. }
  106. }
  107. } else {
  108. - if (!readXRefStreamSection(xrefStr, w, 0, size)) {
  109. + if (!readXRefStreamSection(xrefStr, w, 0, newSize)) {
  110. idx.free();
  111. goto err0;
  112. }
  113. @@ -551,10 +573,16 @@
  114. Guint offset;
  115. int type, gen, c, newSize, i, j;
  116. + if (first + n < 0) {
  117. + return gFalse;
  118. + }
  119. if (first + n > size) {
  120. for (newSize = size ? 2 * size : 1024;
  121. - first + n > newSize;
  122. + first + n > newSize && newSize > 0;
  123. newSize <<= 1) ;
  124. + if (newSize < 0) {
  125. + return gFalse;
  126. + }
  127. entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
  128. for (i = size; i < newSize; ++i) {
  129. entries[i].offset = 0xffffffff;
  130. @@ -585,24 +613,26 @@
  131. }
  132. gen = (gen << 8) + c;
  133. }
  134. - switch (type) {
  135. - case 0:
  136. - entries[i].offset = offset;
  137. - entries[i].gen = gen;
  138. - entries[i].type = xrefEntryFree;
  139. - break;
  140. - case 1:
  141. - entries[i].offset = offset;
  142. - entries[i].gen = gen;
  143. - entries[i].type = xrefEntryUncompressed;
  144. - break;
  145. - case 2:
  146. - entries[i].offset = offset;
  147. - entries[i].gen = gen;
  148. - entries[i].type = xrefEntryCompressed;
  149. - break;
  150. - default:
  151. - return gFalse;
  152. + if (entries[i].offset == 0xffffffff) {
  153. + switch (type) {
  154. + case 0:
  155. + entries[i].offset = offset;
  156. + entries[i].gen = gen;
  157. + entries[i].type = xrefEntryFree;
  158. + break;
  159. + case 1:
  160. + entries[i].offset = offset;
  161. + entries[i].gen = gen;
  162. + entries[i].type = xrefEntryUncompressed;
  163. + break;
  164. + case 2:
  165. + entries[i].offset = offset;
  166. + entries[i].gen = gen;
  167. + entries[i].type = xrefEntryCompressed;
  168. + break;
  169. + default:
  170. + return gFalse;
  171. + }
  172. }
  173. }
  174. @@ -664,38 +694,44 @@
  175. // look for object
  176. } else if (isdigit(*p)) {
  177. num = atoi(p);
  178. - do {
  179. - ++p;
  180. - } while (*p && isdigit(*p));
  181. - if (isspace(*p)) {
  182. + if (num > 0) {
  183. do {
  184. ++p;
  185. - } while (*p && isspace(*p));
  186. - if (isdigit(*p)) {
  187. - gen = atoi(p);
  188. + } while (*p && isdigit(*p));
  189. + if (isspace(*p)) {
  190. do {
  191. ++p;
  192. - } while (*p && isdigit(*p));
  193. - if (isspace(*p)) {
  194. + } while (*p && isspace(*p));
  195. + if (isdigit(*p)) {
  196. + gen = atoi(p);
  197. do {
  198. ++p;
  199. - } while (*p && isspace(*p));
  200. - if (!strncmp(p, "obj", 3)) {
  201. - if (num >= size) {
  202. - newSize = (num + 1 + 255) & ~255;
  203. - entries = (XRefEntry *)
  204. - grealloc(entries, newSize * sizeof(XRefEntry));
  205. - for (i = size; i < newSize; ++i) {
  206. - entries[i].offset = 0xffffffff;
  207. - entries[i].type = xrefEntryFree;
  208. + } while (*p && isdigit(*p));
  209. + if (isspace(*p)) {
  210. + do {
  211. + ++p;
  212. + } while (*p && isspace(*p));
  213. + if (!strncmp(p, "obj", 3)) {
  214. + if (num >= size) {
  215. + newSize = (num + 1 + 255) & ~255;
  216. + if (newSize < 0) {
  217. + error(-1, "Bad object number");
  218. + return gFalse;
  219. + }
  220. + entries = (XRefEntry *)
  221. + grealloc(entries, newSize * sizeof(XRefEntry));
  222. + for (i = size; i < newSize; ++i) {
  223. + entries[i].offset = 0xffffffff;
  224. + entries[i].type = xrefEntryFree;
  225. + }
  226. + size = newSize;
  227. + }
  228. + if (entries[num].type == xrefEntryFree ||
  229. + gen >= entries[num].gen) {
  230. + entries[num].offset = pos - start;
  231. + entries[num].gen = gen;
  232. + entries[num].type = xrefEntryUncompressed;
  233. }
  234. - size = newSize;
  235. - }
  236. - if (entries[num].type == xrefEntryFree ||
  237. - gen >= entries[num].gen) {
  238. - entries[num].offset = pos - start;
  239. - entries[num].gen = gen;
  240. - entries[num].type = xrefEntryUncompressed;
  241. }
  242. }
  243. }