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.

231 lines
5.5 KiB

  1. --- ./xpdf/XRef.cc.orig 2004-11-24 15:01:16.444656632 +0100
  2. +++ ./xpdf/XRef.cc 2004-11-24 15:00:57.007611512 +0100
  3. @@ -96,7 +96,7 @@
  4. }
  5. nObjects = obj1.getInt();
  6. obj1.free();
  7. - if (nObjects == 0) {
  8. + if (nObjects <= 0) {
  9. goto err1;
  10. }
  11. @@ -106,6 +106,9 @@
  12. }
  13. first = obj1.getInt();
  14. obj1.free();
  15. + if (first < 0) {
  16. + goto err1;
  17. + }
  18. objs = new Object[nObjects];
  19. objNums = (int *)gmalloc(nObjects * sizeof(int));
  20. @@ -130,6 +133,12 @@
  21. offsets[i] = obj2.getInt();
  22. obj1.free();
  23. obj2.free();
  24. + if (objNums[i] < 0 || offsets[i] < 0 ||
  25. + (i > 0 && offsets[i] < offsets[i-1])) {
  26. + delete parser;
  27. + gfree(offsets);
  28. + goto err1;
  29. + }
  30. }
  31. while (str->getChar() != EOF) ;
  32. delete parser;
  33. @@ -369,10 +378,16 @@
  34. }
  35. n = obj.getInt();
  36. obj.free();
  37. + if (first < 0 || n < 0 || first + n < 0) {
  38. + goto err1;
  39. + }
  40. if (first + n > size) {
  41. for (newSize = size ? 2 * size : 1024;
  42. - first + n > newSize;
  43. + first + n > newSize && newSize > 0;
  44. newSize <<= 1) ;
  45. + if (newSize < 0) {
  46. + goto err1;
  47. + }
  48. entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
  49. for (i = size; i < newSize; ++i) {
  50. entries[i].offset = 0xffffffff;
  51. @@ -443,7 +458,7 @@
  52. // check for an 'XRefStm' key
  53. if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) {
  54. - pos2 = obj2.getInt();
  55. + pos2 = (Guint)obj2.getInt();
  56. readXRef(&pos2);
  57. if (!ok) {
  58. goto err1;
  59. @@ -474,6 +489,9 @@
  60. }
  61. newSize = obj.getInt();
  62. obj.free();
  63. + if (newSize < 0) {
  64. + goto err1;
  65. + }
  66. if (newSize > size) {
  67. entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
  68. for (i = size; i < newSize; ++i) {
  69. @@ -494,6 +512,9 @@
  70. }
  71. w[i] = obj2.getInt();
  72. obj2.free();
  73. + if (w[i] < 0 || w[i] > 4) {
  74. + goto err1;
  75. + }
  76. }
  77. obj.free();
  78. @@ -513,13 +534,14 @@
  79. }
  80. n = obj.getInt();
  81. obj.free();
  82. - if (!readXRefStreamSection(xrefStr, w, first, n)) {
  83. + if (first < 0 || n < 0 ||
  84. + !readXRefStreamSection(xrefStr, w, first, n)) {
  85. idx.free();
  86. goto err0;
  87. }
  88. }
  89. } else {
  90. - if (!readXRefStreamSection(xrefStr, w, 0, size)) {
  91. + if (!readXRefStreamSection(xrefStr, w, 0, newSize)) {
  92. idx.free();
  93. goto err0;
  94. }
  95. @@ -551,10 +573,16 @@
  96. Guint offset;
  97. int type, gen, c, newSize, i, j;
  98. + if (first + n < 0) {
  99. + return gFalse;
  100. + }
  101. if (first + n > size) {
  102. for (newSize = size ? 2 * size : 1024;
  103. - first + n > newSize;
  104. + first + n > newSize && newSize > 0;
  105. newSize <<= 1) ;
  106. + if (newSize < 0) {
  107. + return gFalse;
  108. + }
  109. entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
  110. for (i = size; i < newSize; ++i) {
  111. entries[i].offset = 0xffffffff;
  112. @@ -585,24 +613,26 @@
  113. }
  114. gen = (gen << 8) + c;
  115. }
  116. - switch (type) {
  117. - case 0:
  118. - entries[i].offset = offset;
  119. - entries[i].gen = gen;
  120. - entries[i].type = xrefEntryFree;
  121. - break;
  122. - case 1:
  123. - entries[i].offset = offset;
  124. - entries[i].gen = gen;
  125. - entries[i].type = xrefEntryUncompressed;
  126. - break;
  127. - case 2:
  128. - entries[i].offset = offset;
  129. - entries[i].gen = gen;
  130. - entries[i].type = xrefEntryCompressed;
  131. - break;
  132. - default:
  133. - return gFalse;
  134. + if (entries[i].offset == 0xffffffff) {
  135. + switch (type) {
  136. + case 0:
  137. + entries[i].offset = offset;
  138. + entries[i].gen = gen;
  139. + entries[i].type = xrefEntryFree;
  140. + break;
  141. + case 1:
  142. + entries[i].offset = offset;
  143. + entries[i].gen = gen;
  144. + entries[i].type = xrefEntryUncompressed;
  145. + break;
  146. + case 2:
  147. + entries[i].offset = offset;
  148. + entries[i].gen = gen;
  149. + entries[i].type = xrefEntryCompressed;
  150. + break;
  151. + default:
  152. + return gFalse;
  153. + }
  154. }
  155. }
  156. @@ -664,38 +694,44 @@
  157. // look for object
  158. } else if (isdigit(*p)) {
  159. num = atoi(p);
  160. - do {
  161. - ++p;
  162. - } while (*p && isdigit(*p));
  163. - if (isspace(*p)) {
  164. + if (num > 0) {
  165. do {
  166. ++p;
  167. - } while (*p && isspace(*p));
  168. - if (isdigit(*p)) {
  169. - gen = atoi(p);
  170. + } while (*p && isdigit(*p));
  171. + if (isspace(*p)) {
  172. do {
  173. ++p;
  174. - } while (*p && isdigit(*p));
  175. - if (isspace(*p)) {
  176. + } while (*p && isspace(*p));
  177. + if (isdigit(*p)) {
  178. + gen = atoi(p);
  179. do {
  180. ++p;
  181. - } while (*p && isspace(*p));
  182. - if (!strncmp(p, "obj", 3)) {
  183. - if (num >= size) {
  184. - newSize = (num + 1 + 255) & ~255;
  185. - entries = (XRefEntry *)
  186. - grealloc(entries, newSize * sizeof(XRefEntry));
  187. - for (i = size; i < newSize; ++i) {
  188. - entries[i].offset = 0xffffffff;
  189. - entries[i].type = xrefEntryFree;
  190. + } while (*p && isdigit(*p));
  191. + if (isspace(*p)) {
  192. + do {
  193. + ++p;
  194. + } while (*p && isspace(*p));
  195. + if (!strncmp(p, "obj", 3)) {
  196. + if (num >= size) {
  197. + newSize = (num + 1 + 255) & ~255;
  198. + if (newSize < 0) {
  199. + error(-1, "Bad object number");
  200. + return gFalse;
  201. + }
  202. + entries = (XRefEntry *)
  203. + grealloc(entries, newSize * sizeof(XRefEntry));
  204. + for (i = size; i < newSize; ++i) {
  205. + entries[i].offset = 0xffffffff;
  206. + entries[i].type = xrefEntryFree;
  207. + }
  208. + size = newSize;
  209. + }
  210. + if (entries[num].type == xrefEntryFree ||
  211. + gen >= entries[num].gen) {
  212. + entries[num].offset = pos - start;
  213. + entries[num].gen = gen;
  214. + entries[num].type = xrefEntryUncompressed;
  215. }
  216. - size = newSize;
  217. - }
  218. - if (entries[num].type == xrefEntryFree ||
  219. - gen >= entries[num].gen) {
  220. - entries[num].offset = pos - start;
  221. - entries[num].gen = gen;
  222. - entries[num].type = xrefEntryUncompressed;
  223. }
  224. }
  225. }