lz4k_decompress.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. /*
  2. * LZ4K Decompressor by Vovo
  3. */
  4. #include <linux/lz4k.h>
  5. #include <linux/types.h>
  6. static unsigned short lz4k_matchlen_decode[128] = {
  7. 780, 1298, 1035, 0, 1033, 1553, 1040, 0, 780, 1304, 1039, 0, 1034, 1567, 1293, 0, 780, 1300,
  8. 1035, 0, 1033, 1558, 1040, 0, 780, 1308, 1039, 0, 1034, 1818, 1294, 0, 780, 1298, 1035, 0, 1033,
  9. 1555, 1040, 0, 780, 1304, 1039, 0, 1034, 1813, 1293, 0, 780, 1300, 1035, 0, 1033, 1559, 1040, 0,
  10. 780, 1308, 1039, 0, 1034, 1821, 1294, 0, 780, 1298, 1035, 0, 1033, 1553, 1040, 0, 780, 1304, 1039,
  11. 0, 1034, 1567, 1293, 0, 780, 1300, 1035, 0, 1033, 1558, 1040, 0, 780, 1308, 1039, 0, 1034, 1819,
  12. 1294, 0, 780, 1298, 1035, 0, 1033, 1555, 1040, 0, 780, 1304, 1039, 0, 1034, 1817, 1293, 0, 780, 1300,
  13. 1035, 0, 1033, 1559, 1040, 0, 780, 1308, 1039, 0, 1034, 1822, 1294, 0, };
  14. static unsigned short lz4k_matchlen_decode_hc[256] = {
  15. 514, 772, 515, 1031, 514, 1029, 515, 1545, 514, 772, 515, 1288, 514, 1030, 515, 2061, 514,
  16. 772, 515, 1031, 514, 1029, 515, 1551, 514, 772, 515, 1291, 514, 1030, 515, 0, 514, 772, 515,
  17. 1031, 514, 1029, 515, 1548, 514, 772, 515, 1288, 514, 1030, 515, 2067, 514, 772, 515, 1031, 514,
  18. 1029, 515, 1802, 514, 772, 515, 1291, 514, 1030, 515, 0, 514, 772, 515, 1031, 514, 1029, 515, 1545,
  19. 514, 772, 515, 1288, 514, 1030, 515, 2065, 514, 772, 515, 1031, 514, 1029, 515, 1551, 514, 772, 515,
  20. 1291, 514, 1030, 515, 0, 514, 772, 515, 1031, 514, 1029, 515, 1548, 514, 772, 515, 1288, 514, 1030,
  21. 515, 2072, 514, 772, 515, 1031, 514, 1029, 515, 1808, 514, 772, 515, 1291, 514, 1030, 515, 0,
  22. 514, 772, 515, 1031, 514, 1029, 515, 1545, 514, 772, 515, 1288, 514, 1030, 515, 2062, 514,
  23. 772, 515, 1031, 514, 1029, 515, 1551, 514, 772, 515, 1291, 514, 1030, 515, 0, 514, 772,
  24. 515, 1031, 514, 1029, 515, 1548, 514, 772, 515, 1288, 514, 1030, 515, 2068, 514, 772,
  25. 515, 1031, 514, 1029, 515, 1802, 514, 772, 515, 1291, 514, 1030, 515, 0,
  26. 514, 772, 515, 1031, 514, 1029, 515, 1545, 514, 772, 515, 1288, 514, 1030, 515, 2066, 514,
  27. 772, 515, 1031, 514, 1029, 515, 1551, 514, 772, 515, 1291, 514, 1030, 515, 0, 514, 772,
  28. 515, 1031, 514, 1029, 515, 1548, 514, 772, 515, 1288, 514, 1030, 515, 2076, 514, 772,
  29. 515, 1031, 514, 1029, 515, 1808, 514, 772, 515, 1291, 514, 1030, 515, 0, };
  30. static unsigned short lz4k_matchoff_decode[128] = {
  31. 1028, 1336, 1040, 1600, 1032, 1568, 1292, 1888, 1028, 1556, 1040, 1852, 1032, 1576, 1304,
  32. 2132, 1028, 1336, 1040, 1836, 1032, 1572, 1292, 1912, 1028, 1564, 1040, 1872, 1032, 1584, 1304, 2156, 1028,
  33. 1336, 1040, 1600, 1032, 1568, 1292, 1904, 1028, 1556, 1040, 1864, 1032, 1576, 1304, 2148, 1028, 1336, 1040,
  34. 1844, 1032, 1572, 1292, 2116, 1028, 1564, 1040, 1880, 1032, 1584, 1304, 2172, 1028, 1336, 1040, 1600, 1032,
  35. 1568, 1292, 1888, 1028, 1556, 1040, 1852, 1032, 1576, 1304, 2140, 1028, 1336, 1040, 1836, 1032, 1572, 1292,
  36. 1912, 1028, 1564, 1040, 1872, 1032, 1584, 1304, 2164, 1028, 1336, 1040, 1600, 1032, 1568, 1292, 1904, 1028,
  37. 1556, 1040, 1864, 1032, 1576, 1304, 2152, 1028, 1336, 1040, 1844, 1032, 1572, 1292, 2124, 1028, 1564, 1040,
  38. 1880, 1032, 1584, 1304, 2176, };
  39. static unsigned short lz4k_matchoff_decode_hc[128] = {
  40. 768, 1560, 1284, 1814, 768, 1836, 1296, 1876, 768, 1820, 1288, 1860, 768, 1856, 1548, 2160,
  41. 768, 1793, 1284, 1822, 768, 1848, 1296, 2144, 768, 1828, 1288, 1868, 768, 1806, 1556, 2176, 768, 1560, 1284,
  42. 1818, 768, 1840, 1296, 2136, 768, 1824, 1288, 1864, 768, 1802, 1548, 2168, 768, 1798, 1284, 1844, 768, 1852,
  43. 1296, 2152, 768, 1832, 1288, 1872, 768, 1810, 1556, 2082, 768, 1560, 1284, 1814, 768, 1836, 1296, 1876, 768,
  44. 1820, 1288, 1860, 768, 1856, 1548, 2164, 768, 1793, 1284, 1822, 768, 1848, 1296, 2148, 768, 1828, 1288, 1868,
  45. 768, 1806, 1556, 2050, 768, 1560, 1284, 1818, 768, 1840, 1296, 2140, 768, 1824, 1288, 1864, 768, 1802, 1548,
  46. 2172, 768, 1798, 1284, 1844, 768, 1852, 1296, 2156, 768, 1832, 1288, 1872, 768, 1810, 1556, 2180, };
  47. static unsigned short lz4k_literallen_decode[128] = {
  48. 257, 770, 257, 1029, 257, 1027, 257, 1543, 257, 770, 257, 1286, 257, 1028, 257, 1806, 257, 770, 257, 1029,
  49. 257, 1027, 257, 1802, 257, 770, 257, 1289, 257, 1028, 257, 0, 257, 770, 257, 1029, 257, 1027, 257, 1544, 257,
  50. 770, 257, 1286, 257, 1028, 257, 1808, 257, 770, 257, 1029, 257, 1027, 257, 1804, 257, 770, 257, 1289, 257,
  51. 1028, 257, 0, 257, 770, 257, 1029, 257, 1027, 257, 1543, 257, 770, 257, 1286, 257, 1028, 257, 1807, 257,
  52. 770, 257, 1029, 257, 1027, 257, 1803, 257, 770, 257, 1289, 257, 1028, 257, 0, 257, 770, 257, 1029, 257, 1027,
  53. 257, 1544, 257, 770, 257, 1286, 257, 1028, 257, 1809, 257, 770, 257, 1029, 257, 1027, 257, 1805, 257, 770,
  54. 257, 1289, 257, 1028, 257, 0, };
  55. static unsigned short lz4k_literalch_decode[512] = { 1024, 2120, 1840, 2327, 1344, 2224, 2060, 2461, 1279, 2151, 1903,
  56. 2411, 1794, 2280, 2082, 2500, 1024, 2132, 1889, 2367, 1537, 2258, 2072, 2479, 1279, 2168, 1920, 2443, 1801,
  57. 2292, 2097, 2524, 1024, 2126, 1872, 2358, 1344, 2240, 2065, 2470, 1279, 2161, 1906, 2433, 1796, 2288, 2089,
  58. 2509, 1024, 2146, 1897, 2391, 1568, 2264, 2077, 2490, 1279, 2192, 2053, 2452, 1808, 2297, 2104, 2537, 1024,
  59. 2124, 1857, 2346, 1344, 2232, 2062, 2466, 1279, 2156, 1904, 2428, 1795, 2285, 2084, 2505, 1024, 2143, 1893,
  60. 2377, 1537, 2260, 2075, 2485, 1279, 2180, 2016, 2447, 1802, 2295, 2099, 2530, 1024, 2130, 1873, 2363, 1344,
  61. 2256, 2067, 2475, 1279, 2165, 1908, 2438, 1800, 2290, 2094, 2519, 1024, 2148, 1902, 2396, 1568, 2275, 2079,
  62. 2495, 1279, 2208, 2055, 2457, 1832, 2300, 2115, 2550, 1024, 2123, 1840, 2342, 1344, 2228, 2061, 2463, 1279,
  63. 2152, 1903, 2426, 1794, 2284, 2083, 2502, 1024, 2136, 1889, 2374, 1537, 2259, 2074, 2482, 1279, 2169, 1920,
  64. 2445, 1801, 2293, 2098, 2526, 1024, 2127, 1872, 2361, 1344, 2248, 2066, 2473, 1279, 2163, 1906, 2435, 1796,
  65. 2289, 2092, 2511, 1024, 2147, 1897, 2394, 1568, 2273, 2078, 2493, 1279, 2200, 2054, 2454, 1808, 2298, 2114,
  66. 2539, 1024, 2125, 1857, 2349, 1344, 2236, 2063, 2468, 1279, 2157, 1904, 2430, 1795, 2286, 2085,
  67. 2507, 1024, 2144, 1893, 2389, 1537, 2261, 2076, 2487, 1279, 2184, 2016, 2450, 1802,
  68. 2296, 2100, 2534, 1024, 2131, 1873, 2365, 1344, 2257, 2068, 2477, 1279, 2166, 1908,
  69. 2441, 1800, 2291, 2095, 2522, 1024, 2150, 1902, 2398, 1568, 2277, 2081, 2498, 1279,
  70. 2216, 2059, 2459, 1832, 2325, 2116, 2557,
  71. 1024, 2120, 1840, 2329, 1344, 2224, 2060, 2462, 1279, 2151, 1903, 2423, 1794, 2280, 2082,
  72. 2501, 1024, 2132, 1889, 2373, 1537, 2258, 2072, 2481, 1279, 2168, 1920, 2444, 1801,
  73. 2292, 2097, 2525, 1024, 2126, 1872, 2359, 1344, 2240, 2065, 2471, 1279, 2161, 1906,
  74. 2434, 1796, 2288, 2089, 2510, 1024, 2146, 1897, 2393, 1568, 2264, 2077, 2491, 1279,
  75. 2192, 2053, 2453, 1808, 2297, 2104, 2538,
  76. 1024, 2124, 1857, 2347, 1344, 2232, 2062, 2467, 1279, 2156, 1904, 2429, 1795, 2285, 2084,
  77. 2506, 1024, 2143, 1893, 2378, 1537, 2260, 2075, 2486, 1279, 2180, 2016, 2449, 1802,
  78. 2295, 2099, 2532, 1024, 2130, 1873, 2364, 1344, 2256, 2067, 2476, 1279, 2165, 1908,
  79. 2439, 1800, 2290, 2094, 2521, 1024, 2148, 1902, 2397, 1568, 2275, 2079, 2497, 1279,
  80. 2208, 2055, 2458, 1832, 2300, 2115, 2555,
  81. 1024, 2123, 1840, 2343, 1344, 2228, 2061, 2465, 1279, 2152, 1903, 2427, 1794, 2284, 2083,
  82. 2503, 1024, 2136, 1889, 2375, 1537, 2259, 2074, 2483, 1279, 2169, 1920, 2446, 1801,
  83. 2293, 2098, 2527, 1024, 2127, 1872, 2362, 1344, 2248, 2066, 2474, 1279, 2163, 1906,
  84. 2437, 1796, 2289, 2092, 2518, 1024, 2147, 1897, 2395, 1568, 2273, 2078, 2494, 1279,
  85. 2200, 2054, 2455, 1808, 2298, 2114, 2543,
  86. 1024, 2125, 1857, 2357, 1344, 2236, 2063, 2469, 1279, 2157, 1904, 2431, 1795, 2286, 2085,
  87. 2508, 1024, 2144, 1893, 2390, 1537, 2261, 2076, 2489, 1279, 2184, 2016, 2451, 1802,
  88. 2296, 2100, 2535, 1024, 2131, 1873, 2366, 1344, 2257, 2068, 2478, 1279, 2166, 1908,
  89. 2442, 1800, 2291, 2095, 2523, 1024, 2150, 1902, 2410, 1568, 2277, 2081, 2499, 1279,
  90. 2216, 2059, 2460, 1832, 2326, 2116, 2558,
  91. };
  92. #define RESERVE_16_BITS() \
  93. {if (remaining_bits <= 16) { \
  94. bits_buffer32 = bits_buffer32 | (*((unsigned short *)ip)) << remaining_bits; \
  95. ip += 2; \
  96. remaining_bits += 16; \
  97. } }
  98. static int lz4k_decompress_simple(const unsigned char *in, size_t in_len, unsigned char *out,
  99. unsigned char *const op_end)
  100. {
  101. unsigned char *op = out;
  102. const unsigned char *ip = in;
  103. unsigned int bits_buffer32 = 0;
  104. unsigned int remaining_bits = 32;
  105. bits_buffer32 = *((unsigned int *)ip);
  106. ip += 4;
  107. bits_buffer32 = bits_buffer32 >> 1;
  108. remaining_bits -= 1;
  109. /* check lz4k tag */
  110. if (*((unsigned int *)(in + in_len - 4)) != LZ4K_TAG)
  111. return -1;
  112. while (1) {
  113. RESERVE_16_BITS();
  114. if ((bits_buffer32 & 1) == 0) {
  115. if ((bits_buffer32 & 2) == 0) {
  116. unsigned short value;
  117. int bits;
  118. value = lz4k_literalch_decode[(bits_buffer32 >> 2) & 0x1ff];
  119. bits = value >> 8;
  120. *op++ = value & 0xff;
  121. bits_buffer32 = bits_buffer32 >> (bits + 2);
  122. remaining_bits -= bits + 2;
  123. } else {
  124. int litlen;
  125. unsigned short value;
  126. value = lz4k_literallen_decode[(bits_buffer32 >> 1) & 0x7f];
  127. if (value != 0) {
  128. int bits = value >> 8;
  129. litlen = value & 0xff;
  130. bits_buffer32 = bits_buffer32 >> (bits + 1);
  131. remaining_bits -= bits + 1;
  132. } else {
  133. if (remaining_bits < 18) {
  134. bits_buffer32 =
  135. bits_buffer32 | ((*ip) << remaining_bits);
  136. ip += 1;
  137. remaining_bits += 8;
  138. }
  139. litlen = ((bits_buffer32 >> 6) & 0xfff) + 1;
  140. bits_buffer32 = bits_buffer32 >> 18;
  141. remaining_bits -= 18;
  142. }
  143. while (1) {
  144. while (remaining_bits > 8) {
  145. unsigned short value;
  146. int bits;
  147. value =
  148. lz4k_literalch_decode[bits_buffer32 & 0x1ff];
  149. bits = value >> 8;
  150. *op++ = value & 0xff;
  151. bits_buffer32 = bits_buffer32 >> bits;
  152. remaining_bits -= bits;
  153. if (--litlen == 0)
  154. goto break_literal;
  155. }
  156. bits_buffer32 =
  157. bits_buffer32 | (*((unsigned int *)ip)) <<
  158. remaining_bits;
  159. ip += 3;
  160. remaining_bits += 24;
  161. }
  162. }
  163. break_literal:
  164. if (__builtin_expect(!!(op == op_end), 0))
  165. break;
  166. } else {
  167. bits_buffer32 = bits_buffer32 >> 1;
  168. remaining_bits -= 1;
  169. }
  170. {
  171. int offset;
  172. int len;
  173. RESERVE_16_BITS();
  174. if ((bits_buffer32 & 1) == 0) {
  175. unsigned short value =
  176. lz4k_matchoff_decode[(bits_buffer32 & 0xff) >> 1];
  177. int bits = value >> 8;
  178. offset = value & 0xff;
  179. bits_buffer32 = bits_buffer32 >> bits;
  180. remaining_bits -= bits;
  181. } else {
  182. offset = (bits_buffer32 >> 1) & 0xfff;
  183. bits_buffer32 = bits_buffer32 >> 13;
  184. remaining_bits -= 13;
  185. }
  186. RESERVE_16_BITS();
  187. if ((bits_buffer32 & 1) == 0) {
  188. len = 3 + ((bits_buffer32 >> 1) & 1);
  189. bits_buffer32 = bits_buffer32 >> 2;
  190. remaining_bits -= 2;
  191. } else if ((bits_buffer32 & 2) == 0) {
  192. len = 5 + ((bits_buffer32 >> 2) & 3);
  193. bits_buffer32 = bits_buffer32 >> 4;
  194. remaining_bits -= 4;
  195. } else {
  196. unsigned short value =
  197. lz4k_matchlen_decode[(bits_buffer32 >> 2) & 0x7f];
  198. if (value != 0) {
  199. int bits = value >> 8;
  200. len = value & 0xff;
  201. bits_buffer32 = bits_buffer32 >> (bits + 2);
  202. remaining_bits -= (bits + 2);
  203. } else {
  204. len = (bits_buffer32 >> 4) & 0xfff;
  205. bits_buffer32 = bits_buffer32 >> 16;
  206. remaining_bits -= 16;
  207. }
  208. }
  209. if (__builtin_expect(!!((offset >> 2) != 0), 1)) {
  210. const unsigned char *m_pos = op - offset;
  211. if ((len & 1) != 0) {
  212. *op++ = *m_pos++;
  213. --len;
  214. }
  215. if ((len & 2) != 0) {
  216. *(unsigned short *)op = *(unsigned short *)m_pos;
  217. op += 2;
  218. m_pos += 2;
  219. len -= 2;
  220. }
  221. while (len > 0) {
  222. *(unsigned int *)op = *(unsigned int *)m_pos;
  223. op += 4;
  224. m_pos += 4;
  225. len -= 4;
  226. }
  227. } else if (__builtin_expect(!!(offset == 1), 1)) {
  228. unsigned int value = *(op - 1);
  229. value = value | (value << 8);
  230. value = value | (value << 16);
  231. if ((len & 1) != 0) {
  232. *op++ = (unsigned char)value;
  233. --len;
  234. }
  235. if ((len & 2) != 0) {
  236. *(unsigned short *)op = (unsigned short)value;
  237. op += 2;
  238. len -= 2;
  239. }
  240. while (len > 0) {
  241. *(unsigned int *)op = (unsigned int)value;
  242. op += 4;
  243. len -= 4;
  244. }
  245. } else {
  246. const unsigned char *m_pos = op - offset;
  247. if ((len & 1) != 0) {
  248. *op++ = *m_pos++;
  249. --len;
  250. }
  251. do {
  252. *((unsigned short *)op) = *((unsigned short *)m_pos);
  253. op += 2;
  254. m_pos += 2;
  255. len -= 2;
  256. } while (len != 0);
  257. }
  258. }
  259. if (__builtin_expect(!!(op == op_end), 0))
  260. break;
  261. }
  262. if (op != op_end)
  263. return -1;
  264. return 0;
  265. }
  266. static int lz4k_decompress_hc(const unsigned char *in, size_t in_len, unsigned char *out,
  267. unsigned char *const op_end)
  268. {
  269. unsigned char *op = out;
  270. const unsigned char *ip = in;
  271. unsigned int bits_buffer32 = 0;
  272. unsigned int remaining_bits = 32;
  273. int previous_off = 0;
  274. bits_buffer32 = *((unsigned int *)ip);
  275. ip += 4;
  276. bits_buffer32 = bits_buffer32 >> 1;
  277. remaining_bits -= 1;
  278. while (1) {
  279. RESERVE_16_BITS();
  280. if ((bits_buffer32 & 1) == 0) {
  281. if ((bits_buffer32 & 2) == 0) {
  282. *op++ = (bits_buffer32 >> 2) & 0xff;
  283. bits_buffer32 = bits_buffer32 >> (8 + 2);
  284. remaining_bits -= 8 + 2;
  285. } else {
  286. int litlen;
  287. unsigned short value;
  288. value = lz4k_literallen_decode[(bits_buffer32 >> 1) & 0x7f];
  289. if (value != 0) {
  290. int bits = value >> 8;
  291. litlen = value & 0xff;
  292. bits_buffer32 = bits_buffer32 >> (bits + 1);
  293. remaining_bits -= bits + 1;
  294. } else {
  295. if (remaining_bits < 18) {
  296. bits_buffer32 =
  297. bits_buffer32 | ((*ip) << remaining_bits);
  298. ip += 1;
  299. remaining_bits += 8;
  300. }
  301. litlen = ((bits_buffer32 >> 6) & 0xfff) + 1;
  302. bits_buffer32 = bits_buffer32 >> 18;
  303. remaining_bits -= 18;
  304. }
  305. RESERVE_16_BITS();
  306. if ((litlen & 1) != 0) {
  307. *op++ = bits_buffer32 & 0xff;
  308. bits_buffer32 = bits_buffer32 >> 8;
  309. remaining_bits -= 8;
  310. --litlen;
  311. RESERVE_16_BITS();
  312. }
  313. do {
  314. *(unsigned short *)op = bits_buffer32 & 0xffff;
  315. bits_buffer32 =
  316. (bits_buffer32 >> 16) | (*(unsigned short *)ip) <<
  317. (remaining_bits - 16);
  318. ip += 2;
  319. op += 2;
  320. litlen -= 2;
  321. } while (litlen > 0);
  322. }
  323. /*break_literal:*/
  324. if (__builtin_expect(!!(op == op_end), 0))
  325. break;
  326. } else {
  327. bits_buffer32 = bits_buffer32 >> 1;
  328. remaining_bits -= 1;
  329. }
  330. {
  331. int offset;
  332. int len;
  333. RESERVE_16_BITS();
  334. if ((bits_buffer32 & 1) == 0) {
  335. unsigned short value =
  336. lz4k_matchoff_decode_hc[(bits_buffer32 & 0xff) >> 1];
  337. int bits = value >> 8;
  338. int code = value & 0xff;
  339. if (code == 0) { /* previous */
  340. offset = previous_off;
  341. } else {
  342. offset = code;
  343. }
  344. bits_buffer32 = bits_buffer32 >> bits;
  345. remaining_bits -= bits;
  346. } else {
  347. int index = op - out;
  348. int bits = 32 - __builtin_clz(index);
  349. offset = (bits_buffer32 >> 1) & ((1 << bits) - 1);
  350. bits_buffer32 = bits_buffer32 >> (bits + 1);
  351. remaining_bits -= bits + 1;
  352. }
  353. previous_off = offset;
  354. RESERVE_16_BITS();
  355. {
  356. if ((bits_buffer32 & 0x1f) != 0x1f) {
  357. unsigned short value =
  358. lz4k_matchlen_decode_hc[(bits_buffer32) & 0xff];
  359. int bits = value >> 8;
  360. len = value & 0xff;
  361. bits_buffer32 = bits_buffer32 >> bits;
  362. remaining_bits -= bits;
  363. } else {
  364. len = (bits_buffer32 >> 5) & 0xfff;
  365. bits_buffer32 = bits_buffer32 >> 17;
  366. remaining_bits -= 17;
  367. }
  368. }
  369. if (__builtin_expect(!!((offset >> 2) != 0), 1)) {
  370. const unsigned char *m_pos = op - offset;
  371. if ((len & 1) != 0) {
  372. *op++ = *m_pos++;
  373. --len;
  374. }
  375. if ((len & 2) != 0) {
  376. *(unsigned short *)op = *(unsigned short *)m_pos;
  377. op += 2;
  378. m_pos += 2;
  379. len -= 2;
  380. }
  381. while (len > 0) {
  382. *(unsigned int *)op = *(unsigned int *)m_pos;
  383. op += 4;
  384. m_pos += 4;
  385. len -= 4;
  386. }
  387. } else if (__builtin_expect(!!(offset == 1), 1)) {
  388. unsigned int value = *(op - 1);
  389. value = value | (value << 8);
  390. value = value | (value << 16);
  391. if ((len & 1) != 0) {
  392. *op++ = (unsigned char)value;
  393. --len;
  394. }
  395. if ((len & 2) != 0) {
  396. *(unsigned short *)op = (unsigned short)value;
  397. op += 2;
  398. len -= 2;
  399. }
  400. while (len > 0) {
  401. *(unsigned int *)op = (unsigned int)value;
  402. op += 4;
  403. len -= 4;
  404. }
  405. } else {
  406. const unsigned char *m_pos = op - offset;
  407. if ((len & 1) != 0) {
  408. *op++ = *m_pos++;
  409. --len;
  410. }
  411. do {
  412. *((unsigned short *)op) = *((unsigned short *)m_pos);
  413. op += 2;
  414. m_pos += 2;
  415. len -= 2;
  416. } while (len != 0);
  417. }
  418. }
  419. if (__builtin_expect(!!(op == op_end), 0))
  420. break;
  421. }
  422. if (op != op_end)
  423. return -1;
  424. return 0;
  425. }
  426. int lz4k_decompress_safe(const unsigned char *in, size_t in_len, unsigned char *out,
  427. size_t *pout_len)
  428. {
  429. int result = 0;
  430. unsigned char *const op_end = out + *pout_len;
  431. if (*pout_len > 4096)
  432. return -1;
  433. if (in_len == 0)
  434. return -1;
  435. result = lz4k_decompress_simple(in, in_len, out, op_end);
  436. return result;
  437. }
  438. int lz4k_decompress_ubifs(const unsigned char *in, size_t in_len, unsigned char *out,
  439. size_t *pout_len)
  440. {
  441. int result = 0;
  442. unsigned char *const op_end = out + *pout_len;
  443. if (*pout_len > 4096)
  444. return -1;
  445. if (in_len == 0)
  446. return -1;
  447. if ((*in & 1) == 0)
  448. result = lz4k_decompress_simple(in, in_len, out, op_end);
  449. else
  450. result = lz4k_decompress_hc(in, in_len, out, op_end);
  451. return result;
  452. }