libmspack 0.10.1 → 0.10.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (355) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +37 -0
  3. data/.gitignore +2 -0
  4. data/ext/Rakefile +1 -1
  5. data/ext/x86_64-linux/libmspack.so +0 -0
  6. data/ext/x86_64-windows/mspack.dll +0 -0
  7. data/lib/libmspack/version.rb +1 -1
  8. data/lib/libmspack.rb +1 -1
  9. data/libmspack.gemspec +1 -1
  10. metadata +6 -348
  11. data/.travis.yml +0 -5
  12. data/ext/i386-windows/libmspack.dll +0 -0
  13. data/ext/libmspack/doc/Doxyfile +0 -9
  14. data/ext/libmspack/doc/Makefile +0 -8
  15. data/ext/libmspack/doc/html/annotated.html +0 -104
  16. data/ext/libmspack/doc/html/bc_s.png +0 -0
  17. data/ext/libmspack/doc/html/bdwn.png +0 -0
  18. data/ext/libmspack/doc/html/classes.html +0 -85
  19. data/ext/libmspack/doc/html/closed.png +0 -0
  20. data/ext/libmspack/doc/html/dir_f4d90282fe865f947a460986b93b960a.html +0 -83
  21. data/ext/libmspack/doc/html/doc.png +0 -0
  22. data/ext/libmspack/doc/html/doxygen.css +0 -1596
  23. data/ext/libmspack/doc/html/doxygen.png +0 -0
  24. data/ext/libmspack/doc/html/dynsections.js +0 -97
  25. data/ext/libmspack/doc/html/files.html +0 -78
  26. data/ext/libmspack/doc/html/folderclosed.png +0 -0
  27. data/ext/libmspack/doc/html/folderopen.png +0 -0
  28. data/ext/libmspack/doc/html/functions.html +0 -454
  29. data/ext/libmspack/doc/html/functions_vars.html +0 -454
  30. data/ext/libmspack/doc/html/globals.html +0 -406
  31. data/ext/libmspack/doc/html/globals_defs.html +0 -316
  32. data/ext/libmspack/doc/html/globals_func.html +0 -161
  33. data/ext/libmspack/doc/html/graph_legend.html +0 -102
  34. data/ext/libmspack/doc/html/graph_legend.md5 +0 -1
  35. data/ext/libmspack/doc/html/graph_legend.png +0 -0
  36. data/ext/libmspack/doc/html/index.html +0 -167
  37. data/ext/libmspack/doc/html/jquery.js +0 -87
  38. data/ext/libmspack/doc/html/menu.js +0 -26
  39. data/ext/libmspack/doc/html/menudata.js +0 -56
  40. data/ext/libmspack/doc/html/mspack_8h.html +0 -2664
  41. data/ext/libmspack/doc/html/mspack_8h__incl.map +0 -2
  42. data/ext/libmspack/doc/html/mspack_8h__incl.md5 +0 -1
  43. data/ext/libmspack/doc/html/mspack_8h__incl.png +0 -0
  44. data/ext/libmspack/doc/html/mspack_8h_source.html +0 -238
  45. data/ext/libmspack/doc/html/nav_f.png +0 -0
  46. data/ext/libmspack/doc/html/nav_g.png +0 -0
  47. data/ext/libmspack/doc/html/nav_h.png +0 -0
  48. data/ext/libmspack/doc/html/open.png +0 -0
  49. data/ext/libmspack/doc/html/search/all_0.html +0 -26
  50. data/ext/libmspack/doc/html/search/all_0.js +0 -6
  51. data/ext/libmspack/doc/html/search/all_1.html +0 -26
  52. data/ext/libmspack/doc/html/search/all_1.js +0 -5
  53. data/ext/libmspack/doc/html/search/all_10.html +0 -26
  54. data/ext/libmspack/doc/html/search/all_10.js +0 -8
  55. data/ext/libmspack/doc/html/search/all_11.html +0 -26
  56. data/ext/libmspack/doc/html/search/all_11.js +0 -4
  57. data/ext/libmspack/doc/html/search/all_12.html +0 -26
  58. data/ext/libmspack/doc/html/search/all_12.js +0 -4
  59. data/ext/libmspack/doc/html/search/all_13.html +0 -26
  60. data/ext/libmspack/doc/html/search/all_13.js +0 -4
  61. data/ext/libmspack/doc/html/search/all_2.html +0 -26
  62. data/ext/libmspack/doc/html/search/all_2.js +0 -14
  63. data/ext/libmspack/doc/html/search/all_3.html +0 -26
  64. data/ext/libmspack/doc/html/search/all_3.js +0 -13
  65. data/ext/libmspack/doc/html/search/all_4.html +0 -26
  66. data/ext/libmspack/doc/html/search/all_4.js +0 -6
  67. data/ext/libmspack/doc/html/search/all_5.html +0 -26
  68. data/ext/libmspack/doc/html/search/all_5.js +0 -13
  69. data/ext/libmspack/doc/html/search/all_6.html +0 -26
  70. data/ext/libmspack/doc/html/search/all_6.js +0 -4
  71. data/ext/libmspack/doc/html/search/all_7.html +0 -26
  72. data/ext/libmspack/doc/html/search/all_7.js +0 -5
  73. data/ext/libmspack/doc/html/search/all_8.html +0 -26
  74. data/ext/libmspack/doc/html/search/all_8.js +0 -5
  75. data/ext/libmspack/doc/html/search/all_9.html +0 -26
  76. data/ext/libmspack/doc/html/search/all_9.js +0 -7
  77. data/ext/libmspack/doc/html/search/all_a.html +0 -26
  78. data/ext/libmspack/doc/html/search/all_a.js +0 -144
  79. data/ext/libmspack/doc/html/search/all_b.html +0 -26
  80. data/ext/libmspack/doc/html/search/all_b.js +0 -10
  81. data/ext/libmspack/doc/html/search/all_c.html +0 -26
  82. data/ext/libmspack/doc/html/search/all_c.js +0 -5
  83. data/ext/libmspack/doc/html/search/all_d.html +0 -26
  84. data/ext/libmspack/doc/html/search/all_d.js +0 -7
  85. data/ext/libmspack/doc/html/search/all_e.html +0 -26
  86. data/ext/libmspack/doc/html/search/all_e.js +0 -5
  87. data/ext/libmspack/doc/html/search/all_f.html +0 -26
  88. data/ext/libmspack/doc/html/search/all_f.js +0 -15
  89. data/ext/libmspack/doc/html/search/classes_0.html +0 -26
  90. data/ext/libmspack/doc/html/search/classes_0.js +0 -30
  91. data/ext/libmspack/doc/html/search/close.png +0 -0
  92. data/ext/libmspack/doc/html/search/defines_0.html +0 -26
  93. data/ext/libmspack/doc/html/search/defines_0.js +0 -84
  94. data/ext/libmspack/doc/html/search/files_0.html +0 -26
  95. data/ext/libmspack/doc/html/search/files_0.js +0 -4
  96. data/ext/libmspack/doc/html/search/functions_0.html +0 -26
  97. data/ext/libmspack/doc/html/search/functions_0.js +0 -33
  98. data/ext/libmspack/doc/html/search/mag_sel.png +0 -0
  99. data/ext/libmspack/doc/html/search/nomatches.html +0 -12
  100. data/ext/libmspack/doc/html/search/search.css +0 -271
  101. data/ext/libmspack/doc/html/search/search.js +0 -791
  102. data/ext/libmspack/doc/html/search/search_l.png +0 -0
  103. data/ext/libmspack/doc/html/search/search_m.png +0 -0
  104. data/ext/libmspack/doc/html/search/search_r.png +0 -0
  105. data/ext/libmspack/doc/html/search/searchdata.js +0 -30
  106. data/ext/libmspack/doc/html/search/variables_0.html +0 -26
  107. data/ext/libmspack/doc/html/search/variables_0.js +0 -6
  108. data/ext/libmspack/doc/html/search/variables_1.html +0 -26
  109. data/ext/libmspack/doc/html/search/variables_1.js +0 -5
  110. data/ext/libmspack/doc/html/search/variables_10.html +0 -26
  111. data/ext/libmspack/doc/html/search/variables_10.js +0 -8
  112. data/ext/libmspack/doc/html/search/variables_11.html +0 -26
  113. data/ext/libmspack/doc/html/search/variables_11.js +0 -4
  114. data/ext/libmspack/doc/html/search/variables_12.html +0 -26
  115. data/ext/libmspack/doc/html/search/variables_12.js +0 -4
  116. data/ext/libmspack/doc/html/search/variables_13.html +0 -26
  117. data/ext/libmspack/doc/html/search/variables_13.js +0 -4
  118. data/ext/libmspack/doc/html/search/variables_2.html +0 -26
  119. data/ext/libmspack/doc/html/search/variables_2.js +0 -14
  120. data/ext/libmspack/doc/html/search/variables_3.html +0 -26
  121. data/ext/libmspack/doc/html/search/variables_3.js +0 -13
  122. data/ext/libmspack/doc/html/search/variables_4.html +0 -26
  123. data/ext/libmspack/doc/html/search/variables_4.js +0 -6
  124. data/ext/libmspack/doc/html/search/variables_5.html +0 -26
  125. data/ext/libmspack/doc/html/search/variables_5.js +0 -13
  126. data/ext/libmspack/doc/html/search/variables_6.html +0 -26
  127. data/ext/libmspack/doc/html/search/variables_6.js +0 -4
  128. data/ext/libmspack/doc/html/search/variables_7.html +0 -26
  129. data/ext/libmspack/doc/html/search/variables_7.js +0 -5
  130. data/ext/libmspack/doc/html/search/variables_8.html +0 -26
  131. data/ext/libmspack/doc/html/search/variables_8.js +0 -5
  132. data/ext/libmspack/doc/html/search/variables_9.html +0 -26
  133. data/ext/libmspack/doc/html/search/variables_9.js +0 -7
  134. data/ext/libmspack/doc/html/search/variables_a.html +0 -26
  135. data/ext/libmspack/doc/html/search/variables_a.js +0 -5
  136. data/ext/libmspack/doc/html/search/variables_b.html +0 -26
  137. data/ext/libmspack/doc/html/search/variables_b.js +0 -10
  138. data/ext/libmspack/doc/html/search/variables_c.html +0 -26
  139. data/ext/libmspack/doc/html/search/variables_c.js +0 -5
  140. data/ext/libmspack/doc/html/search/variables_d.html +0 -26
  141. data/ext/libmspack/doc/html/search/variables_d.js +0 -7
  142. data/ext/libmspack/doc/html/search/variables_e.html +0 -26
  143. data/ext/libmspack/doc/html/search/variables_e.js +0 -5
  144. data/ext/libmspack/doc/html/search/variables_f.html +0 -26
  145. data/ext/libmspack/doc/html/search/variables_f.js +0 -15
  146. data/ext/libmspack/doc/html/splitbar.png +0 -0
  147. data/ext/libmspack/doc/html/structmscab__compressor.html +0 -106
  148. data/ext/libmspack/doc/html/structmscab__decompressor.html +0 -361
  149. data/ext/libmspack/doc/html/structmscab__decompressor__coll__graph.map +0 -5
  150. data/ext/libmspack/doc/html/structmscab__decompressor__coll__graph.md5 +0 -1
  151. data/ext/libmspack/doc/html/structmscab__decompressor__coll__graph.png +0 -0
  152. data/ext/libmspack/doc/html/structmscabd__cabinet.html +0 -418
  153. data/ext/libmspack/doc/html/structmscabd__cabinet__coll__graph.map +0 -4
  154. data/ext/libmspack/doc/html/structmscabd__cabinet__coll__graph.md5 +0 -1
  155. data/ext/libmspack/doc/html/structmscabd__cabinet__coll__graph.png +0 -0
  156. data/ext/libmspack/doc/html/structmscabd__file.html +0 -337
  157. data/ext/libmspack/doc/html/structmscabd__file__coll__graph.map +0 -3
  158. data/ext/libmspack/doc/html/structmscabd__file__coll__graph.md5 +0 -1
  159. data/ext/libmspack/doc/html/structmscabd__file__coll__graph.png +0 -0
  160. data/ext/libmspack/doc/html/structmscabd__folder.html +0 -159
  161. data/ext/libmspack/doc/html/structmscabd__folder__coll__graph.map +0 -2
  162. data/ext/libmspack/doc/html/structmscabd__folder__coll__graph.md5 +0 -1
  163. data/ext/libmspack/doc/html/structmscabd__folder__coll__graph.png +0 -0
  164. data/ext/libmspack/doc/html/structmschm__compressor.html +0 -226
  165. data/ext/libmspack/doc/html/structmschm__decompressor.html +0 -299
  166. data/ext/libmspack/doc/html/structmschm__decompressor__coll__graph.map +0 -7
  167. data/ext/libmspack/doc/html/structmschm__decompressor__coll__graph.md5 +0 -1
  168. data/ext/libmspack/doc/html/structmschm__decompressor__coll__graph.png +0 -0
  169. data/ext/libmspack/doc/html/structmschmc__file.html +0 -169
  170. data/ext/libmspack/doc/html/structmschmd__file.html +0 -198
  171. data/ext/libmspack/doc/html/structmschmd__file__coll__graph.map +0 -6
  172. data/ext/libmspack/doc/html/structmschmd__file__coll__graph.md5 +0 -1
  173. data/ext/libmspack/doc/html/structmschmd__file__coll__graph.png +0 -0
  174. data/ext/libmspack/doc/html/structmschmd__header.html +0 -458
  175. data/ext/libmspack/doc/html/structmschmd__header__coll__graph.map +0 -6
  176. data/ext/libmspack/doc/html/structmschmd__header__coll__graph.md5 +0 -1
  177. data/ext/libmspack/doc/html/structmschmd__header__coll__graph.png +0 -0
  178. data/ext/libmspack/doc/html/structmschmd__sec__mscompressed.html +0 -198
  179. data/ext/libmspack/doc/html/structmschmd__sec__mscompressed__coll__graph.map +0 -6
  180. data/ext/libmspack/doc/html/structmschmd__sec__mscompressed__coll__graph.md5 +0 -1
  181. data/ext/libmspack/doc/html/structmschmd__sec__mscompressed__coll__graph.png +0 -0
  182. data/ext/libmspack/doc/html/structmschmd__sec__uncompressed.html +0 -140
  183. data/ext/libmspack/doc/html/structmschmd__sec__uncompressed__coll__graph.map +0 -6
  184. data/ext/libmspack/doc/html/structmschmd__sec__uncompressed__coll__graph.md5 +0 -1
  185. data/ext/libmspack/doc/html/structmschmd__sec__uncompressed__coll__graph.png +0 -0
  186. data/ext/libmspack/doc/html/structmschmd__section.html +0 -142
  187. data/ext/libmspack/doc/html/structmschmd__section__coll__graph.map +0 -6
  188. data/ext/libmspack/doc/html/structmschmd__section__coll__graph.md5 +0 -1
  189. data/ext/libmspack/doc/html/structmschmd__section__coll__graph.png +0 -0
  190. data/ext/libmspack/doc/html/structmshlp__compressor.html +0 -106
  191. data/ext/libmspack/doc/html/structmshlp__decompressor.html +0 -106
  192. data/ext/libmspack/doc/html/structmskwaj__compressor.html +0 -243
  193. data/ext/libmspack/doc/html/structmskwaj__decompressor.html +0 -245
  194. data/ext/libmspack/doc/html/structmskwaj__decompressor__coll__graph.map +0 -3
  195. data/ext/libmspack/doc/html/structmskwaj__decompressor__coll__graph.md5 +0 -1
  196. data/ext/libmspack/doc/html/structmskwaj__decompressor__coll__graph.png +0 -0
  197. data/ext/libmspack/doc/html/structmskwajd__header.html +0 -225
  198. data/ext/libmspack/doc/html/structmslit__compressor.html +0 -106
  199. data/ext/libmspack/doc/html/structmslit__decompressor.html +0 -106
  200. data/ext/libmspack/doc/html/structmsoab__compressor.html +0 -151
  201. data/ext/libmspack/doc/html/structmsoab__decompressor.html +0 -184
  202. data/ext/libmspack/doc/html/structmspack__file.html +0 -107
  203. data/ext/libmspack/doc/html/structmspack__system.html +0 -404
  204. data/ext/libmspack/doc/html/structmspack__system__coll__graph.map +0 -3
  205. data/ext/libmspack/doc/html/structmspack__system__coll__graph.md5 +0 -1
  206. data/ext/libmspack/doc/html/structmspack__system__coll__graph.png +0 -0
  207. data/ext/libmspack/doc/html/structmsszdd__compressor.html +0 -186
  208. data/ext/libmspack/doc/html/structmsszdd__decompressor.html +0 -246
  209. data/ext/libmspack/doc/html/structmsszdd__decompressor__coll__graph.map +0 -3
  210. data/ext/libmspack/doc/html/structmsszdd__decompressor__coll__graph.md5 +0 -1
  211. data/ext/libmspack/doc/html/structmsszdd__decompressor__coll__graph.png +0 -0
  212. data/ext/libmspack/doc/html/structmsszddd__header.html +0 -149
  213. data/ext/libmspack/doc/html/sync_off.png +0 -0
  214. data/ext/libmspack/doc/html/sync_on.png +0 -0
  215. data/ext/libmspack/doc/html/szdd_kwaj_format.html +0 -331
  216. data/ext/libmspack/doc/html/tab_a.png +0 -0
  217. data/ext/libmspack/doc/html/tab_b.png +0 -0
  218. data/ext/libmspack/doc/html/tab_h.png +0 -0
  219. data/ext/libmspack/doc/html/tab_s.png +0 -0
  220. data/ext/libmspack/doc/html/tabs.css +0 -1
  221. data/ext/libmspack/doc/szdd_kwaj_format.html +0 -331
  222. data/ext/libmspack/examples/cabd_memory.c +0 -179
  223. data/ext/libmspack/examples/cabrip.c +0 -85
  224. data/ext/libmspack/examples/chmextract.c +0 -121
  225. data/ext/libmspack/examples/msexpand.c +0 -48
  226. data/ext/libmspack/examples/multifh.c +0 -435
  227. data/ext/libmspack/examples/oabextract.c +0 -41
  228. data/ext/libmspack/test/cabd_md5.c +0 -161
  229. data/ext/libmspack/test/cabd_test.c +0 -468
  230. data/ext/libmspack/test/chmd_find.c +0 -95
  231. data/ext/libmspack/test/chmd_md5.c +0 -67
  232. data/ext/libmspack/test/chmd_order.c +0 -144
  233. data/ext/libmspack/test/chmd_test.c +0 -134
  234. data/ext/libmspack/test/chminfo.c +0 -285
  235. data/ext/libmspack/test/error.h +0 -22
  236. data/ext/libmspack/test/kwajd_test.c +0 -119
  237. data/ext/libmspack/test/md5.c +0 -450
  238. data/ext/libmspack/test/md5.h +0 -166
  239. data/ext/libmspack/test/md5_fh.h +0 -123
  240. data/ext/libmspack/test/test_files/cabd/1.pl +0 -84
  241. data/ext/libmspack/test/test_files/cabd/2.pl +0 -75
  242. data/ext/libmspack/test/test_files/cabd/bad_folderindex.cab +0 -0
  243. data/ext/libmspack/test/test_files/cabd/bad_nofiles.cab +0 -0
  244. data/ext/libmspack/test/test_files/cabd/bad_nofolders.cab +0 -0
  245. data/ext/libmspack/test/test_files/cabd/bad_signature.cab +0 -0
  246. data/ext/libmspack/test/test_files/cabd/cve-2010-2800-mszip-infinite-loop.cab +0 -0
  247. data/ext/libmspack/test/test_files/cabd/cve-2014-9556-qtm-infinite-loop.cab +0 -0
  248. data/ext/libmspack/test/test_files/cabd/cve-2014-9732-folders-segfault.cab +0 -0
  249. data/ext/libmspack/test/test_files/cabd/cve-2015-4470-mszip-over-read.cab +0 -0
  250. data/ext/libmspack/test/test_files/cabd/cve-2015-4471-lzx-under-read.cab +0 -0
  251. data/ext/libmspack/test/test_files/cabd/filename-read-violation-1.cab +0 -0
  252. data/ext/libmspack/test/test_files/cabd/filename-read-violation-2.cab +0 -0
  253. data/ext/libmspack/test/test_files/cabd/filename-read-violation-3.cab +0 -0
  254. data/ext/libmspack/test/test_files/cabd/filename-read-violation-4.cab +0 -0
  255. data/ext/libmspack/test/test_files/cabd/lzx-main-tree-no-lengths.cab +0 -0
  256. data/ext/libmspack/test/test_files/cabd/lzx-premature-matches.cab +0 -0
  257. data/ext/libmspack/test/test_files/cabd/mszip_lzx_qtm.cab +0 -0
  258. data/ext/libmspack/test/test_files/cabd/multi_basic_pt1.cab +0 -0
  259. data/ext/libmspack/test/test_files/cabd/multi_basic_pt2.cab +0 -0
  260. data/ext/libmspack/test/test_files/cabd/multi_basic_pt3.cab +0 -0
  261. data/ext/libmspack/test/test_files/cabd/multi_basic_pt4.cab +0 -0
  262. data/ext/libmspack/test/test_files/cabd/multi_basic_pt5.cab +0 -0
  263. data/ext/libmspack/test/test_files/cabd/normal_255c_filename.cab +0 -0
  264. data/ext/libmspack/test/test_files/cabd/normal_2files_1folder.cab +0 -0
  265. data/ext/libmspack/test/test_files/cabd/normal_2files_2folders.cab +0 -0
  266. data/ext/libmspack/test/test_files/cabd/partial_nodata.cab +0 -0
  267. data/ext/libmspack/test/test_files/cabd/partial_nofiles.cab +0 -0
  268. data/ext/libmspack/test/test_files/cabd/partial_nofolder.cab +0 -0
  269. data/ext/libmspack/test/test_files/cabd/partial_shortextheader.cab +0 -0
  270. data/ext/libmspack/test/test_files/cabd/partial_shortfile1.cab +0 -0
  271. data/ext/libmspack/test/test_files/cabd/partial_shortfile2.cab +0 -0
  272. data/ext/libmspack/test/test_files/cabd/partial_shortfolder.cab +0 -0
  273. data/ext/libmspack/test/test_files/cabd/partial_shortheader.cab +0 -0
  274. data/ext/libmspack/test/test_files/cabd/partial_str_nofname.cab +0 -0
  275. data/ext/libmspack/test/test_files/cabd/partial_str_noninfo.cab +0 -0
  276. data/ext/libmspack/test/test_files/cabd/partial_str_nonname.cab +0 -0
  277. data/ext/libmspack/test/test_files/cabd/partial_str_nopinfo.cab +0 -0
  278. data/ext/libmspack/test/test_files/cabd/partial_str_nopname.cab +0 -0
  279. data/ext/libmspack/test/test_files/cabd/partial_str_shortfname.cab +0 -0
  280. data/ext/libmspack/test/test_files/cabd/partial_str_shortninfo.cab +0 -0
  281. data/ext/libmspack/test/test_files/cabd/partial_str_shortnname.cab +0 -0
  282. data/ext/libmspack/test/test_files/cabd/partial_str_shortpinfo.cab +0 -0
  283. data/ext/libmspack/test/test_files/cabd/partial_str_shortpname.cab +0 -0
  284. data/ext/libmspack/test/test_files/cabd/qtm-max-size-block.cab +0 -0
  285. data/ext/libmspack/test/test_files/cabd/reserve_---.cab +0 -0
  286. data/ext/libmspack/test/test_files/cabd/reserve_--D.cab +0 -0
  287. data/ext/libmspack/test/test_files/cabd/reserve_-F-.cab +0 -0
  288. data/ext/libmspack/test/test_files/cabd/reserve_-FD.cab +0 -0
  289. data/ext/libmspack/test/test_files/cabd/reserve_H--.cab +0 -0
  290. data/ext/libmspack/test/test_files/cabd/reserve_H-D.cab +0 -0
  291. data/ext/libmspack/test/test_files/cabd/reserve_HF-.cab +0 -0
  292. data/ext/libmspack/test/test_files/cabd/reserve_HFD.cab +0 -0
  293. data/ext/libmspack/test/test_files/cabd/search_basic.cab +0 -0
  294. data/ext/libmspack/test/test_files/cabd/search_tricky1.cab +0 -0
  295. data/ext/libmspack/test/test_files/chmd/blank-filenames.chm +0 -0
  296. data/ext/libmspack/test/test_files/chmd/cve-2015-4467-reset-interval-zero.chm.xor +0 -0
  297. data/ext/libmspack/test/test_files/chmd/cve-2015-4468-namelen-bounds.chm +0 -0
  298. data/ext/libmspack/test/test_files/chmd/cve-2015-4469-namelen-bounds.chm +0 -0
  299. data/ext/libmspack/test/test_files/chmd/cve-2015-4472-namelen-bounds.chm +0 -0
  300. data/ext/libmspack/test/test_files/chmd/cve-2017-6419-lzx-negative-spaninfo.chm +0 -0
  301. data/ext/libmspack/test/test_files/chmd/short-system-filenames.chm +0 -0
  302. data/ext/libmspack/test/test_files/kwajd/f00.kwj +0 -0
  303. data/ext/libmspack/test/test_files/kwajd/f01.kwj +0 -0
  304. data/ext/libmspack/test/test_files/kwajd/f02.kwj +0 -0
  305. data/ext/libmspack/test/test_files/kwajd/f03.kwj +0 -0
  306. data/ext/libmspack/test/test_files/kwajd/f04.kwj +0 -0
  307. data/ext/libmspack/test/test_files/kwajd/f10.kwj +0 -0
  308. data/ext/libmspack/test/test_files/kwajd/f11.kwj +0 -0
  309. data/ext/libmspack/test/test_files/kwajd/f12.kwj +0 -0
  310. data/ext/libmspack/test/test_files/kwajd/f13.kwj +0 -0
  311. data/ext/libmspack/test/test_files/kwajd/f14.kwj +0 -0
  312. data/ext/libmspack/test/test_files/kwajd/f20.kwj +0 -0
  313. data/ext/libmspack/test/test_files/kwajd/f21.kwj +0 -0
  314. data/ext/libmspack/test/test_files/kwajd/f22.kwj +0 -0
  315. data/ext/libmspack/test/test_files/kwajd/f23.kwj +0 -0
  316. data/ext/libmspack/test/test_files/kwajd/f24.kwj +0 -0
  317. data/ext/libmspack/test/test_files/kwajd/f30.kwj +0 -0
  318. data/ext/libmspack/test/test_files/kwajd/f31.kwj +0 -0
  319. data/ext/libmspack/test/test_files/kwajd/f32.kwj +0 -0
  320. data/ext/libmspack/test/test_files/kwajd/f33.kwj +0 -0
  321. data/ext/libmspack/test/test_files/kwajd/f34.kwj +0 -0
  322. data/ext/libmspack/test/test_files/kwajd/f40.kwj +0 -0
  323. data/ext/libmspack/test/test_files/kwajd/f41.kwj +0 -0
  324. data/ext/libmspack/test/test_files/kwajd/f42.kwj +0 -0
  325. data/ext/libmspack/test/test_files/kwajd/f43.kwj +0 -0
  326. data/ext/libmspack/test/test_files/kwajd/f44.kwj +0 -0
  327. data/ext/libmspack/test/test_files/kwajd/f50.kwj +0 -0
  328. data/ext/libmspack/test/test_files/kwajd/f51.kwj +0 -0
  329. data/ext/libmspack/test/test_files/kwajd/f52.kwj +0 -0
  330. data/ext/libmspack/test/test_files/kwajd/f53.kwj +0 -0
  331. data/ext/libmspack/test/test_files/kwajd/f54.kwj +0 -0
  332. data/ext/libmspack/test/test_files/kwajd/f60.kwj +0 -0
  333. data/ext/libmspack/test/test_files/kwajd/f61.kwj +0 -0
  334. data/ext/libmspack/test/test_files/kwajd/f62.kwj +0 -0
  335. data/ext/libmspack/test/test_files/kwajd/f63.kwj +0 -0
  336. data/ext/libmspack/test/test_files/kwajd/f64.kwj +0 -0
  337. data/ext/libmspack/test/test_files/kwajd/f70.kwj +0 -0
  338. data/ext/libmspack/test/test_files/kwajd/f71.kwj +0 -0
  339. data/ext/libmspack/test/test_files/kwajd/f72.kwj +0 -0
  340. data/ext/libmspack/test/test_files/kwajd/f73.kwj +0 -0
  341. data/ext/libmspack/test/test_files/kwajd/f74.kwj +0 -0
  342. data/ext/libmspack/test/test_files/kwajd/f80.kwj +0 -0
  343. data/ext/libmspack/test/test_files/kwajd/f81.kwj +0 -0
  344. data/ext/libmspack/test/test_files/kwajd/f82.kwj +0 -0
  345. data/ext/libmspack/test/test_files/kwajd/f83.kwj +0 -0
  346. data/ext/libmspack/test/test_files/kwajd/f84.kwj +0 -0
  347. data/ext/libmspack/test/test_files/kwajd/f90.kwj +0 -0
  348. data/ext/libmspack/test/test_files/kwajd/f91.kwj +0 -0
  349. data/ext/libmspack/test/test_files/kwajd/f92.kwj +0 -0
  350. data/ext/libmspack/test/test_files/kwajd/f93.kwj +0 -0
  351. data/ext/libmspack/test/test_files/kwajd/f94.kwj +0 -0
  352. data/ext/libmspack/test/test_files/kwajd/make.pl +0 -17
  353. data/ext/x86_64-linux/liblibmspack.so +0 -0
  354. data/ext/x86_64-windows/libmspack.dll +0 -0
  355. data/ext/x86_64-windows-msys/libmspack.dll +0 -0
@@ -1,161 +0,0 @@
1
- #ifdef HAVE_CONFIG_H
2
- #include <config.h>
3
- #endif
4
-
5
- #include <stdio.h>
6
- #include <stdlib.h>
7
- #include <string.h>
8
- #include <mspack.h>
9
- #include <sys/stat.h>
10
- #include <dirent.h>
11
-
12
- #include <md5_fh.h>
13
- #include <error.h>
14
-
15
- /**
16
- * Matches a cabinet's filename case-insensitively in the filesystem and
17
- * returns the case-correct form.
18
- *
19
- * @param origcab if this is non-NULL, the pathname part of this filename
20
- * will be extracted, and the search will be conducted in
21
- * that directory.
22
- * @param cabname the internal CAB filename to search for.
23
- * @return a copy of the full, case-correct filename of the given cabinet
24
- * filename, or NULL if the specified filename does not exist on disk.
25
- */
26
- static char *find_cabinet_file(char *origcab, char *cabname) {
27
- struct dirent *entry;
28
- struct stat st_buf;
29
- int found = 0, len;
30
- char *tail, *cab;
31
- DIR *dir;
32
-
33
- /* ensure we have a cabinet name at all */
34
- if (!cabname || !cabname[0]) return NULL;
35
-
36
- /* find if there's a directory path in the origcab */
37
- tail = origcab ? strrchr(origcab, '/') : NULL;
38
- len = (tail - origcab) + 1;
39
-
40
- /* allocate memory for our copy */
41
- if (!(cab = (char *) malloc((tail ? len : 2) + strlen(cabname) + 1))) return NULL;
42
-
43
- /* add the directory path from the original cabinet name, or "." */
44
- if (tail) memcpy(cab, origcab, (size_t) len);
45
- else cab[0]='.', cab[1]='/', len=2;
46
- cab[len] = '\0';
47
-
48
- /* try accessing the cabinet with its current name (case-sensitive) */
49
- strcpy(&cab[len], cabname);
50
- if (stat(cab, &st_buf) == 0) {
51
- found = 1;
52
- }
53
- else {
54
- /* cabinet was not found, look for it in the current dir */
55
- cab[len] = '\0';
56
- if ((dir = opendir(cab))) {
57
- while ((entry = readdir(dir))) {
58
- if (strcasecmp(cabname, entry->d_name) == 0) {
59
- strcat(cab, entry->d_name);
60
- found = (stat(cab, &st_buf) == 0);
61
- break;
62
- }
63
- }
64
- closedir(dir);
65
- }
66
- }
67
-
68
- if (!found || !S_ISREG(st_buf.st_mode)) {
69
- /* cabinet not found, or not a regular file */
70
- free(cab);
71
- cab = NULL;
72
- }
73
-
74
- return cab;
75
- }
76
-
77
-
78
- int main(int argc, char *argv[]) {
79
- struct mscab_decompressor *cabd;
80
- struct mscabd_cabinet *cab, *c, *c2;
81
- struct mscabd_file *file;
82
- char *cabname, *newname;
83
- int err;
84
-
85
- setbuf(stdout, NULL);
86
- setbuf(stderr, NULL);
87
-
88
- /* if self-test reveals an error */
89
- MSPACK_SYS_SELFTEST(err);
90
- if (err) return 1;
91
-
92
- if (!(cabd = mspack_create_cab_decompressor(&read_files_write_md5))) {
93
- fprintf(stderr, "can't make decompressor\n");
94
- return 1;
95
- }
96
-
97
- for (argv++; (cabname = *argv); argv++) {
98
- printf("*** %s\n", cabname);
99
-
100
- if (!(cab = cabd->open(cabd, cabname))) {
101
- fprintf(stderr, "cab open error: %s\n", ERROR(cabd));
102
- continue;
103
- }
104
-
105
- /* prepend any spanning cabinets */
106
- for (c = cab; c && (c->flags & MSCAB_HDR_PREVCAB); c = c->prevcab) {
107
- if (!(newname = find_cabinet_file(cabname, c->prevname))) {
108
- fprintf(stderr, "%s: can't find \"%s\" to prepend\n",
109
- cabname, c->prevname);
110
- break;
111
- }
112
- if (!(c2 = cabd->open(cabd, newname))) {
113
- fprintf(stderr, "%s: error opening \"%s\" for prepend: %s\n",
114
- cabname, newname, ERROR(cabd));
115
- break;
116
- }
117
- if (cabd->prepend(cabd, c, c2) != MSPACK_ERR_OK) {
118
- fprintf(stderr, "%s: error prepending \"%s\": %s\n",
119
- cabname, newname, ERROR(cabd));
120
- break;
121
- }
122
- }
123
-
124
- /* append any spanning cabinets */
125
- for (c = cab; c && (c->flags & MSCAB_HDR_NEXTCAB); c = c->nextcab) {
126
- if (!(newname = find_cabinet_file(cabname, c->nextname))) {
127
- fprintf(stderr, "%s: can't find \"%s\" to append\n",
128
- cabname, c->nextname);
129
- break;
130
- }
131
- if (!(c2 = cabd->open(cabd, newname))) {
132
- fprintf(stderr, "%s: error opening \"%s\" for append: %s\n",
133
- cabname, newname, ERROR(cabd));
134
- break;
135
- }
136
- if (cabd->append(cabd, c, c2) != MSPACK_ERR_OK) {
137
- fprintf(stderr, "%s: error appending \"%s\": %s\n",
138
- cabname, newname, ERROR(cabd));
139
- break;
140
- }
141
- }
142
-
143
- /* extract files */
144
- for (file = cab->files; file; file = file->next ) {
145
- if (cabd->extract(cabd, file, NULL) == MSPACK_ERR_OK) {
146
- printf("%s %s\n", md5_string, file->filename);
147
- }
148
- else {
149
- fprintf(stderr, "%s: error extracting \"%s\": %s\n",
150
- cabname, file->filename, ERROR(cabd));
151
- }
152
- }
153
-
154
- /* free all resources */
155
- for (c2 = cab->prevcab; c2; c2 = c2->prevcab) free((void*)c2->filename);
156
- for (c2 = cab->nextcab; c2; c2 = c2->nextcab) free((void*)c2->filename);
157
- cabd->close(cabd, cab);
158
- }
159
- mspack_destroy_cab_decompressor(cabd);
160
- return 0;
161
- }
@@ -1,468 +0,0 @@
1
- /* cabinet decompression regression test suite */
2
-
3
- #ifdef HAVE_CONFIG_H
4
- # include <config.h>
5
- #endif
6
-
7
- #include <stdio.h>
8
- #include <stdlib.h>
9
- #include <string.h>
10
- #include <mspack.h>
11
- #include <system.h>
12
-
13
- #define __tf3(x) #x
14
- #define __tf2(x) __tf3(x)
15
- #define TESTFILE(fname) (__tf2(TEST_FILES) "/" fname)
16
-
17
- unsigned int test_count = 0;
18
-
19
- #define TEST(x) do {\
20
- test_count++; \
21
- if (!(x)) {printf("%s:%d FAILED %s\n",__func__,__LINE__,#x);exit(1);} \
22
- } while (0)
23
-
24
- /* open where cab file doesn't exist */
25
- void cabd_open_test_01() {
26
- struct mscab_decompressor *cabd;
27
-
28
- TEST(cabd = mspack_create_cab_decompressor(NULL));
29
- TEST(!cabd->open(cabd, "!!!FILE_WHICH_DOES_NOT_EXIST"));
30
- TEST(cabd->last_error(cabd) == MSPACK_ERR_OPEN);
31
-
32
- mspack_destroy_cab_decompressor(cabd);
33
- }
34
-
35
- /* normal cab file with 2 files and one folder.
36
- * check ALL headers are read correctly */
37
- void cabd_open_test_02() {
38
- struct mscab_decompressor *cabd;
39
- struct mscabd_cabinet *cab;
40
- struct mscabd_folder *folder;
41
- struct mscabd_file *file;
42
-
43
- TEST(cabd = mspack_create_cab_decompressor(NULL));
44
- TEST(cab = cabd->open(cabd, TESTFILE("normal_2files_1folder.cab")));
45
-
46
- TEST(cab->next == NULL);
47
- TEST(cab->base_offset == 0);
48
- TEST(cab->length == 253);
49
- TEST(cab->prevcab == NULL); TEST(cab->nextcab == NULL);
50
- TEST(cab->prevname == NULL); TEST(cab->nextname == NULL);
51
- TEST(cab->previnfo == NULL); TEST(cab->nextinfo == NULL);
52
- TEST(cab->set_id = 1570); TEST(cab->set_index == 0);
53
- TEST(cab->header_resv == 0);
54
- TEST(cab->flags == 0);
55
-
56
- TEST(folder = cab->folders);
57
- TEST(folder->next == NULL);
58
- TEST(folder->comp_type == 0);
59
- TEST(folder->num_blocks == 1);
60
-
61
- file = cab->files;
62
- TEST(file && !strcmp(file->filename, "hello.c"));
63
- TEST(file->length == 77);
64
- TEST(file->attribs == 0x20);
65
- TEST(file->time_h == 11);TEST(file->time_m == 13);TEST(file->time_s == 52);
66
- TEST(file->date_d == 12);TEST(file->date_m == 3);TEST(file->date_y == 1997);
67
- TEST(file->folder == folder); TEST(file->offset == 0);
68
-
69
- file = file->next;
70
- TEST(file && !strcmp(file->filename, "welcome.c"));
71
- TEST(file->length == 74);
72
- TEST(file->attribs == 0x20);
73
- TEST(file->time_h == 11);TEST(file->time_m == 15);TEST(file->time_s == 14);
74
- TEST(file->date_d == 12);TEST(file->date_m == 3);TEST(file->date_y == 1997);
75
- TEST(file->folder == folder); TEST(file->offset == 77);
76
-
77
- TEST(file->next == NULL);
78
-
79
- cabd->close(cabd, cab);
80
- mspack_destroy_cab_decompressor(cabd);
81
- }
82
-
83
- /* cabs with reserve headers set, ensure they all load correctly */
84
- void cabd_open_test_03() {
85
- struct mscab_decompressor *cabd;
86
- struct mscabd_cabinet *cab;
87
- unsigned int i;
88
- const char *files[] = {
89
- TESTFILE("reserve_---.cab"),
90
- TESTFILE("reserve_--D.cab"),
91
- TESTFILE("reserve_-F-.cab"),
92
- TESTFILE("reserve_-FD.cab"),
93
- TESTFILE("reserve_H--.cab"),
94
- TESTFILE("reserve_H-D.cab"),
95
- TESTFILE("reserve_HF-.cab"),
96
- TESTFILE("reserve_HFD.cab"),
97
- };
98
-
99
- TEST(cabd = mspack_create_cab_decompressor(NULL));
100
-
101
- for (i = 0; i < (sizeof(files)/sizeof(char *)); i++) {
102
- TEST(cab = cabd->open(cabd, files[i]));
103
- TEST(cab->files && !strcmp(cab->files->filename, "test1.txt"));
104
- TEST(cab->files->next && !strcmp(cab->files->next->filename, "test2.txt"));
105
- cabd->close(cabd, cab);
106
- }
107
-
108
- mspack_destroy_cab_decompressor(cabd);
109
- }
110
-
111
- /* some bad cabs, should not load */
112
- void cabd_open_test_04() {
113
- struct mscab_decompressor *cabd;
114
-
115
- TEST(cabd = mspack_create_cab_decompressor(NULL));
116
-
117
- /* cab has enough data for a header, but does not contain real cab data
118
- * result should be MSPACK_ERR_SIGNATURE */
119
- TEST(!cabd->open(cabd, TESTFILE("bad_signature.cab")));
120
- TEST(cabd->last_error(cabd) == MSPACK_ERR_SIGNATURE);
121
-
122
- /* cab has 0 folders */
123
- TEST(!cabd->open(cabd, TESTFILE("bad_nofolders.cab")));
124
-
125
- /* cab has 0 files */
126
- TEST(!cabd->open(cabd, TESTFILE("bad_nofiles.cab")));
127
-
128
- /* second file in the cab has a folder index for a non-existant folder */
129
- TEST(!cabd->open(cabd, TESTFILE("bad_folderindex.cab")));
130
-
131
- /* cab has one file with empty filename */
132
- TEST(!cabd->open(cabd, TESTFILE("filename-read-violation-1.cab")));
133
-
134
- mspack_destroy_cab_decompressor(cabd);
135
- }
136
-
137
- /* cabs which have been cut short
138
- * result should be MSPACK_ERR_READ for missing headers or
139
- * MSPACK_ERR_DATAFORMAT for missing/partial strings.
140
- * If only data blocks are missing, the cab should open()
141
- */
142
- void cabd_open_test_05() {
143
- struct mscab_decompressor *cabd;
144
- struct mscabd_cabinet *cab;
145
- unsigned int i;
146
- const char *files[] = {
147
- TESTFILE("partial_shortheader.cab"),
148
- TESTFILE("partial_shortextheader.cab"),
149
- TESTFILE("partial_nofolder.cab"),
150
- TESTFILE("partial_shortfolder.cab"),
151
- TESTFILE("partial_nofiles.cab"),
152
- TESTFILE("partial_shortfile1.cab"),
153
- TESTFILE("partial_shortfile2.cab"),
154
- };
155
- const char *str_files[] = {
156
- TESTFILE("partial_str_nopname.cab"),
157
- TESTFILE("partial_str_shortpname.cab"),
158
- TESTFILE("partial_str_nopinfo.cab"),
159
- TESTFILE("partial_str_shortpinfo.cab"),
160
- TESTFILE("partial_str_nonname.cab"),
161
- TESTFILE("partial_str_shortnname.cab"),
162
- TESTFILE("partial_str_noninfo.cab"),
163
- TESTFILE("partial_str_shortninfo.cab"),
164
- TESTFILE("partial_str_nofname.cab"),
165
- TESTFILE("partial_str_shortfname.cab"),
166
- };
167
-
168
- TEST(cabd = mspack_create_cab_decompressor(NULL));
169
-
170
- for (i = 0; i < (sizeof(files)/sizeof(char *)); i++) {
171
- TEST(!cabd->open(cabd, files[i]));
172
- TEST(cabd->last_error(cabd) == MSPACK_ERR_READ);
173
- }
174
-
175
- for (i = 0; i < (sizeof(str_files)/sizeof(char *)); i++) {
176
- TEST(!cabd->open(cabd, str_files[i]));
177
- TEST(cabd->last_error(cabd) == MSPACK_ERR_DATAFORMAT ||
178
- cabd->last_error(cabd) == MSPACK_ERR_READ);
179
- }
180
-
181
- /* lack of data blocks should NOT be a problem for merely reading */
182
- TEST(cab = cabd->open(cabd, TESTFILE("partial_nodata.cab")));
183
- cabd->close(cabd, cab);
184
- mspack_destroy_cab_decompressor(cabd);
185
- }
186
-
187
- /* open cab with 255 character filename (maximum allowed) */
188
- void cabd_open_test_06() {
189
- struct mscab_decompressor *cabd;
190
- struct mscabd_cabinet *cab;
191
-
192
- TEST(cabd = mspack_create_cab_decompressor(NULL));
193
- TEST(cab = cabd->open(cabd, TESTFILE("normal_255c_filename.cab")));
194
-
195
- cabd->close(cabd, cab);
196
- mspack_destroy_cab_decompressor(cabd);
197
- }
198
-
199
-
200
- /* open where search file doesn't exist */
201
- void cabd_search_test_01() {
202
- struct mscab_decompressor *cabd;
203
-
204
- TEST(cabd = mspack_create_cab_decompressor(NULL));
205
- TEST(!cabd->search(cabd, "!!!FILE_WHICH_DOES_NOT_EXIST"));
206
- TEST(cabd->last_error(cabd) == MSPACK_ERR_OPEN);
207
-
208
- mspack_destroy_cab_decompressor(cabd);
209
- }
210
-
211
- /* search file using 1-byte buffer */
212
- void cabd_search_test_02() {
213
- struct mscab_decompressor *cabd;
214
- struct mscabd_cabinet *cab;
215
-
216
- TEST(cabd = mspack_create_cab_decompressor(NULL));
217
- cabd->set_param(cabd, MSCABD_PARAM_SEARCHBUF, 1);
218
- TEST(cab = cabd->search(cabd, TESTFILE("search_basic.cab")));
219
-
220
- TEST(cab->base_offset == 6);
221
- TEST(cab->files && !strcmp(cab->files->filename, "hello.c"));
222
- TEST(cab->files->next && !strcmp(cab->files->next->filename, "welcome.c"));
223
-
224
- TEST(cab->next != NULL);
225
- TEST(cab->next->base_offset == 265);
226
- TEST(cab->next->files && !strcmp(cab->next->files->filename, "hello.c"));
227
- TEST(cab->next->files->next && !strcmp(cab->next->files->next->filename, "welcome.c"));
228
-
229
- TEST(cab->next->next == NULL);
230
-
231
- cabd->close(cabd, cab);
232
- mspack_destroy_cab_decompressor(cabd);
233
- }
234
-
235
- /* tricky searches */
236
- void cabd_search_test_03() {
237
- struct mscab_decompressor *cabd;
238
- struct mscabd_cabinet *cab;
239
-
240
- TEST(cabd = mspack_create_cab_decompressor(NULL));
241
-
242
- /* there is only ONE cab in this file. it is prepended by 4 bytes, "MSCF"
243
- * (heh) and reserved fields in the real cab are filled in so the fake one
244
- * looks real to the scanner but not the real reader
245
- */
246
- TEST(cab = cabd->search(cabd, TESTFILE("search_tricky1.cab")));
247
- TEST(cab->next == NULL);
248
- TEST(cab->base_offset == 4);
249
- TEST(cab->files && !strcmp(cab->files->filename, "hello.c"));
250
- TEST(cab->files->next && !strcmp(cab->files->next->filename, "welcome.c"));
251
-
252
- cabd->close(cabd, cab);
253
- mspack_destroy_cab_decompressor(cabd);
254
- }
255
-
256
- /* basic parameter failures */
257
- void cabd_merge_test_01() {
258
- struct mscab_decompressor *cabd;
259
- struct mscabd_cabinet *cab1, *cab2;
260
-
261
- TEST(cabd = mspack_create_cab_decompressor(NULL));
262
- TEST(cab1 = cabd->open(cabd, TESTFILE("multi_basic_pt1.cab")));
263
- TEST(cab2 = cabd->open(cabd, TESTFILE("multi_basic_pt2.cab")));
264
-
265
- TEST(cabd->append(cabd, cab1, NULL) != MSPACK_ERR_OK);
266
- TEST(cabd->append(cabd, NULL, cab1) != MSPACK_ERR_OK);
267
- TEST(cabd->append(cabd, cab1, cab1) != MSPACK_ERR_OK);
268
- TEST(cabd->prepend(cabd, cab1, NULL) != MSPACK_ERR_OK);
269
- TEST(cabd->prepend(cabd, NULL, cab1) != MSPACK_ERR_OK);
270
- TEST(cabd->prepend(cabd, cab1, cab1) != MSPACK_ERR_OK);
271
-
272
- /* merge cabs, then try merging again every other way */
273
- TEST(cabd->append(cabd, cab1, cab2) == MSPACK_ERR_OK);
274
- TEST(cabd->append(cabd, cab2, cab1) != MSPACK_ERR_OK);
275
- TEST(cabd->prepend(cabd, cab1, cab2) != MSPACK_ERR_OK);
276
- TEST(cabd->prepend(cabd, cab2, cab1) != MSPACK_ERR_OK);
277
- TEST(cabd->append(cabd, cab1, cab2) != MSPACK_ERR_OK);
278
-
279
- cabd->close(cabd, cab1);
280
- mspack_destroy_cab_decompressor(cabd);
281
- }
282
-
283
- /* test merging a normal 5 part single folder cabinet set with slightly
284
- * haphazard ordering. should still merge fine */
285
- void cabd_merge_test_02() {
286
- struct mscab_decompressor *cabd;
287
- struct mscabd_cabinet *cab[5];
288
-
289
- TEST(cabd = mspack_create_cab_decompressor(NULL));
290
- TEST(cab[0] = cabd->open(cabd, TESTFILE("multi_basic_pt1.cab")));
291
- TEST(cab[1] = cabd->open(cabd, TESTFILE("multi_basic_pt2.cab")));
292
- TEST(cab[2] = cabd->open(cabd, TESTFILE("multi_basic_pt3.cab")));
293
- TEST(cab[3] = cabd->open(cabd, TESTFILE("multi_basic_pt4.cab")));
294
- TEST(cab[4] = cabd->open(cabd, TESTFILE("multi_basic_pt5.cab")));
295
-
296
- TEST(cabd->append(cabd, cab[0], cab[1]) == MSPACK_ERR_OK);
297
- TEST(cabd->prepend(cabd, cab[2], cab[1]) == MSPACK_ERR_OK);
298
- TEST(cabd->append(cabd, cab[3], cab[4]) == MSPACK_ERR_OK);
299
- TEST(cabd->prepend(cabd, cab[3], cab[2]) == MSPACK_ERR_OK);
300
-
301
- TEST(cab[0]->files != NULL);
302
- TEST(cab[0]->files->next != NULL);
303
- TEST(cab[0]->files->next->next != NULL);
304
- TEST(cab[0]->files->next->next->next == NULL);
305
- TEST(cab[0]->files == cab[1]->files);
306
- TEST(cab[1]->files == cab[2]->files);
307
- TEST(cab[2]->files == cab[3]->files);
308
- TEST(cab[3]->files == cab[4]->files);
309
-
310
- TEST(cab[0]->folders != NULL);
311
- TEST(cab[0]->folders->next == NULL);
312
- TEST(cab[0]->folders == cab[1]->folders);
313
- TEST(cab[1]->folders == cab[2]->folders);
314
- TEST(cab[2]->folders == cab[3]->folders);
315
- TEST(cab[3]->folders == cab[4]->folders);
316
-
317
- cabd->close(cabd, cab[0]);
318
- mspack_destroy_cab_decompressor(cabd);
319
- }
320
-
321
- /* test bad cabinets cannot be extracted */
322
- void cabd_extract_test_01() {
323
- struct mscab_decompressor *cabd;
324
- struct mscabd_cabinet *cab;
325
- struct mscabd_file *file;
326
- unsigned int i;
327
- const char *files[] = {
328
- TESTFILE("cve-2010-2800-mszip-infinite-loop.cab"),
329
- TESTFILE("cve-2014-9556-qtm-infinite-loop.cab"),
330
- TESTFILE("cve-2015-4470-mszip-over-read.cab"),
331
- TESTFILE("cve-2015-4471-lzx-under-read.cab"),
332
- TESTFILE("filename-read-violation-2.cab"),
333
- TESTFILE("filename-read-violation-3.cab"),
334
- TESTFILE("filename-read-violation-4.cab"),
335
- TESTFILE("lzx-main-tree-no-lengths.cab"),
336
- TESTFILE("lzx-premature-matches.cab"),
337
- TESTFILE("qtm-max-size-block.cab"),
338
- };
339
-
340
- TEST(cabd = mspack_create_cab_decompressor(NULL));
341
-
342
- for (i = 0; i < (sizeof(files)/sizeof(char *)); i++) {
343
- TEST(cab = cabd->open(cabd, files[i]));
344
- TEST(cab->files != NULL);
345
- for (file = cab->files; file; file = file->next) {
346
- int err = cabd->extract(cabd, file, "/dev/null");
347
- TEST(err == MSPACK_ERR_DATAFORMAT || err == MSPACK_ERR_DECRUNCH);
348
- }
349
- cabd->close(cabd, cab);
350
- }
351
- mspack_destroy_cab_decompressor(cabd);
352
- }
353
-
354
- /* test that CVE-2014-9732 is fixed */
355
- void cabd_extract_test_02() {
356
- struct mscab_decompressor *cabd;
357
- struct mscabd_cabinet *cab;
358
- int err;
359
-
360
- /* the first file in this cabinet belongs to a valid folder. The
361
- * second belongs to an invalid folder. Unpacking files 1, 2, 1
362
- * caused cabd.c to try and free the invalid folder state left by
363
- * extracting from folder 2, which caused a jump to NULL / segfault
364
- */
365
- TEST(cabd = mspack_create_cab_decompressor(NULL));
366
- TEST(cab = cabd->open(cabd, TESTFILE("cve-2014-9732-folders-segfault.cab")));
367
- err = cabd->extract(cabd, cab->files, "/dev/null");
368
- TEST(err == MSPACK_ERR_OK);
369
- err = cabd->extract(cabd, cab->files->next, "/dev/null");
370
- TEST(err == MSPACK_ERR_DATAFORMAT || err == MSPACK_ERR_DECRUNCH);
371
- err = cabd->extract(cabd, cab->files, "/dev/null");
372
- TEST(err == MSPACK_ERR_OK);
373
- cabd->close(cabd, cab);
374
- mspack_destroy_cab_decompressor(cabd);
375
- }
376
-
377
- #include <md5_fh.h>
378
-
379
- /* test that extraction works with all compression methods */
380
- void cabd_extract_test_03() {
381
- struct mscab_decompressor *cabd;
382
- struct mscabd_cabinet *cab;
383
-
384
- cabd = mspack_create_cab_decompressor(&read_files_write_md5);
385
- TEST(cabd != NULL);
386
- cab = cabd->open(cabd, TESTFILE("mszip_lzx_qtm.cab"));
387
- TEST(cab != NULL);
388
-
389
- /* extract mszip.txt */
390
- TEST(cabd->extract(cabd, cab->files, NULL) == MSPACK_ERR_OK);
391
- TEST(memcmp(md5_string, "940cba86658fbceb582faecd2b5975d1", 33) == 0);
392
- /* extract lzx.txt */
393
- TEST(cabd->extract(cabd, cab->files->next, NULL) == MSPACK_ERR_OK);
394
- TEST(memcmp(md5_string, "703474293b614e7110b3eb8ac2762b53", 33) == 0);
395
- /* extract qtm.txt */
396
- TEST(cabd->extract(cabd, cab->files->next->next, NULL) == MSPACK_ERR_OK);
397
- TEST(memcmp(md5_string, "98fcfa4962a0f169a3c7fdbcb445cf17", 33) == 0);
398
-
399
- cabd->close(cabd, cab);
400
- mspack_destroy_cab_decompressor(cabd);
401
- }
402
-
403
-
404
- /* test that extraction works with multiple compression methods in any order */
405
- void cabd_extract_test_04() {
406
- struct mscab_decompressor *cabd;
407
- struct mscabd_cabinet *cab;
408
- struct mscabd_file *f, *files[4];
409
- char file_md5s[4][33];
410
- int i, err;
411
-
412
- cabd = mspack_create_cab_decompressor(&read_files_write_md5);
413
- TEST(cabd != NULL);
414
- cab = cabd->open(cabd, TESTFILE("normal_2files_2folders.cab"));
415
- TEST(cab != NULL);
416
-
417
- /* extract each file once, in order, keep its md5 checksum */
418
- for (f = cab->files, i = 0; i < 4 && f; i++, f=f->next) {
419
- files[i] = f;
420
- err = cabd->extract(cabd, files[i], NULL);
421
- TEST(err == MSPACK_ERR_OK);
422
- memcpy(file_md5s[i], md5_string, 33);
423
- }
424
- TEST(i == 4);
425
-
426
- /* check extracting in any other permutation gives same result */
427
- #define T1(i) TEST(cabd->extract(cabd, files[i], NULL) == MSPACK_ERR_OK); \
428
- TEST(memcmp(file_md5s[i], md5_string, 33) == 0)
429
- #define T(a,b,c,d) T1(a); T1(b); T1(c); T1(d)
430
- /*------*/ T(0,1,3,2); T(0,2,1,3); T(0,2,3,1); T(0,3,1,2); T(0,3,2,1);
431
- T(1,0,2,3); T(1,0,3,2); T(1,2,0,3); T(1,2,3,0); T(1,3,0,2); T(1,3,2,0);
432
- T(2,0,1,3); T(2,0,3,1); T(2,1,0,3); T(2,1,3,0); T(2,3,0,1); T(2,3,1,0);
433
- T(3,0,1,2); T(3,0,2,1); T(3,1,0,2); T(3,1,2,0); T(3,2,0,1); T(3,2,1,0);
434
- #undef T
435
- #undef T1
436
-
437
- cabd->close(cabd, cab);
438
- mspack_destroy_cab_decompressor(cabd);
439
- }
440
-
441
- int main() {
442
- int selftest;
443
-
444
- MSPACK_SYS_SELFTEST(selftest);
445
- TEST(selftest == MSPACK_ERR_OK);
446
-
447
- cabd_open_test_01();
448
- cabd_open_test_02();
449
- cabd_open_test_03();
450
- cabd_open_test_04();
451
- cabd_open_test_05();
452
- cabd_open_test_06();
453
-
454
- cabd_search_test_01();
455
- cabd_search_test_02();
456
- cabd_search_test_03();
457
-
458
- cabd_merge_test_01();
459
- cabd_merge_test_02();
460
-
461
- cabd_extract_test_01();
462
- cabd_extract_test_02();
463
- cabd_extract_test_03();
464
- cabd_extract_test_04();
465
-
466
- printf("ALL %d TESTS PASSED.\n", test_count);
467
- return 0;
468
- }