Lines Matching refs:s

167 static bool fill_temp(struct xz_dec *s, struct xz_buf *b)  in fill_temp()  argument
170 b->in_size - b->in_pos, s->temp.size - s->temp.pos); in fill_temp()
172 memcpy(s->temp.buf + s->temp.pos, b->in + b->in_pos, copy_size); in fill_temp()
174 s->temp.pos += copy_size; in fill_temp()
176 if (s->temp.pos == s->temp.size) { in fill_temp()
177 s->temp.pos = 0; in fill_temp()
185 static enum xz_ret dec_vli(struct xz_dec *s, const uint8_t *in, in dec_vli() argument
190 if (s->pos == 0) in dec_vli()
191 s->vli = 0; in dec_vli()
197 s->vli |= (vli_type)(byte & 0x7F) << s->pos; in dec_vli()
201 if (byte == 0 && s->pos != 0) in dec_vli()
204 s->pos = 0; in dec_vli()
208 s->pos += 7; in dec_vli()
209 if (s->pos == 7 * VLI_BYTES_MAX) in dec_vli()
228 static enum xz_ret dec_block(struct xz_dec *s, struct xz_buf *b) in dec_block() argument
232 s->in_start = b->in_pos; in dec_block()
233 s->out_start = b->out_pos; in dec_block()
236 if (s->bcj_active) in dec_block()
237 ret = xz_dec_bcj_run(s->bcj, s->lzma2, b); in dec_block()
240 ret = xz_dec_lzma2_run(s->lzma2, b); in dec_block()
242 s->block.compressed += b->in_pos - s->in_start; in dec_block()
243 s->block.uncompressed += b->out_pos - s->out_start; in dec_block()
249 if (s->block.compressed > s->block_header.compressed in dec_block()
250 || s->block.uncompressed in dec_block()
251 > s->block_header.uncompressed) in dec_block()
254 if (s->check_type == XZ_CHECK_CRC32) in dec_block()
255 s->crc = xz_crc32(b->out + s->out_start, in dec_block()
256 b->out_pos - s->out_start, s->crc); in dec_block()
258 else if (s->check_type == XZ_CHECK_CRC64) in dec_block()
259 s->crc = xz_crc64(b->out + s->out_start, in dec_block()
260 b->out_pos - s->out_start, s->crc); in dec_block()
264 if (s->block_header.compressed != VLI_UNKNOWN in dec_block()
265 && s->block_header.compressed in dec_block()
266 != s->block.compressed) in dec_block()
269 if (s->block_header.uncompressed != VLI_UNKNOWN in dec_block()
270 && s->block_header.uncompressed in dec_block()
271 != s->block.uncompressed) in dec_block()
274 s->block.hash.unpadded += s->block_header.size in dec_block()
275 + s->block.compressed; in dec_block()
278 s->block.hash.unpadded += check_sizes[s->check_type]; in dec_block()
280 if (s->check_type == XZ_CHECK_CRC32) in dec_block()
281 s->block.hash.unpadded += 4; in dec_block()
282 else if (IS_CRC64(s->check_type)) in dec_block()
283 s->block.hash.unpadded += 8; in dec_block()
286 s->block.hash.uncompressed += s->block.uncompressed; in dec_block()
287 s->block.hash.crc32 = xz_crc32( in dec_block()
288 (const uint8_t *)&s->block.hash, in dec_block()
289 sizeof(s->block.hash), s->block.hash.crc32); in dec_block()
291 ++s->block.count; in dec_block()
298 static void index_update(struct xz_dec *s, const struct xz_buf *b) in index_update() argument
300 size_t in_used = b->in_pos - s->in_start; in index_update()
301 s->index.size += in_used; in index_update()
302 s->crc = xz_crc32(b->in + s->in_start, in_used, s->crc); in index_update()
313 static enum xz_ret dec_index(struct xz_dec *s, struct xz_buf *b) in dec_index() argument
318 ret = dec_vli(s, b->in, &b->in_pos, b->in_size); in dec_index()
320 index_update(s, b); in dec_index()
324 switch (s->index.sequence) { in dec_index()
326 s->index.count = s->vli; in dec_index()
333 if (s->index.count != s->block.count) in dec_index()
336 s->index.sequence = SEQ_INDEX_UNPADDED; in dec_index()
340 s->index.hash.unpadded += s->vli; in dec_index()
341 s->index.sequence = SEQ_INDEX_UNCOMPRESSED; in dec_index()
345 s->index.hash.uncompressed += s->vli; in dec_index()
346 s->index.hash.crc32 = xz_crc32( in dec_index()
347 (const uint8_t *)&s->index.hash, in dec_index()
348 sizeof(s->index.hash), in dec_index()
349 s->index.hash.crc32); in dec_index()
350 --s->index.count; in dec_index()
351 s->index.sequence = SEQ_INDEX_UNPADDED; in dec_index()
354 } while (s->index.count > 0); in dec_index()
364 static enum xz_ret crc_validate(struct xz_dec *s, struct xz_buf *b, in crc_validate() argument
371 if (((s->crc >> s->pos) & 0xFF) != b->in[b->in_pos++]) in crc_validate()
374 s->pos += 8; in crc_validate()
376 } while (s->pos < bits); in crc_validate()
378 s->crc = 0; in crc_validate()
379 s->pos = 0; in crc_validate()
389 static bool check_skip(struct xz_dec *s, struct xz_buf *b) in check_skip() argument
391 while (s->pos < check_sizes[s->check_type]) { in check_skip()
396 ++s->pos; in check_skip()
399 s->pos = 0; in check_skip()
406 static enum xz_ret dec_stream_header(struct xz_dec *s) in dec_stream_header() argument
408 if (!memeq(s->temp.buf, HEADER_MAGIC, HEADER_MAGIC_SIZE)) in dec_stream_header()
411 if (xz_crc32(s->temp.buf + HEADER_MAGIC_SIZE, 2, 0) in dec_stream_header()
412 != get_le32(s->temp.buf + HEADER_MAGIC_SIZE + 2)) in dec_stream_header()
415 if (s->temp.buf[HEADER_MAGIC_SIZE] != 0) in dec_stream_header()
425 s->check_type = s->temp.buf[HEADER_MAGIC_SIZE + 1]; in dec_stream_header()
428 if (s->check_type > XZ_CHECK_MAX) in dec_stream_header()
431 if (s->check_type > XZ_CHECK_CRC32 && !IS_CRC64(s->check_type)) in dec_stream_header()
434 if (s->check_type > XZ_CHECK_CRC32 && !IS_CRC64(s->check_type)) in dec_stream_header()
442 static enum xz_ret dec_stream_footer(struct xz_dec *s) in dec_stream_footer() argument
444 if (!memeq(s->temp.buf + 10, FOOTER_MAGIC, FOOTER_MAGIC_SIZE)) in dec_stream_footer()
447 if (xz_crc32(s->temp.buf + 4, 6, 0) != get_le32(s->temp.buf)) in dec_stream_footer()
455 if ((s->index.size >> 2) != get_le32(s->temp.buf + 4)) in dec_stream_footer()
458 if (s->temp.buf[8] != 0 || s->temp.buf[9] != s->check_type) in dec_stream_footer()
469 static enum xz_ret dec_block_header(struct xz_dec *s) in dec_block_header() argument
477 s->temp.size -= 4; in dec_block_header()
478 if (xz_crc32(s->temp.buf, s->temp.size, 0) in dec_block_header()
479 != get_le32(s->temp.buf + s->temp.size)) in dec_block_header()
482 s->temp.pos = 2; in dec_block_header()
489 if (s->temp.buf[1] & 0x3E) in dec_block_header()
491 if (s->temp.buf[1] & 0x3F) in dec_block_header()
496 if (s->temp.buf[1] & 0x40) { in dec_block_header()
497 if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size) in dec_block_header()
501 s->block_header.compressed = s->vli; in dec_block_header()
503 s->block_header.compressed = VLI_UNKNOWN; in dec_block_header()
507 if (s->temp.buf[1] & 0x80) { in dec_block_header()
508 if (dec_vli(s, s->temp.buf, &s->temp.pos, s->temp.size) in dec_block_header()
512 s->block_header.uncompressed = s->vli; in dec_block_header()
514 s->block_header.uncompressed = VLI_UNKNOWN; in dec_block_header()
519 s->bcj_active = s->temp.buf[1] & 0x01; in dec_block_header()
520 if (s->bcj_active) { in dec_block_header()
521 if (s->temp.size - s->temp.pos < 2) in dec_block_header()
524 ret = xz_dec_bcj_reset(s->bcj, s->temp.buf[s->temp.pos++]); in dec_block_header()
532 if (s->temp.buf[s->temp.pos++] != 0x00) in dec_block_header()
538 if (s->temp.size - s->temp.pos < 2) in dec_block_header()
542 if (s->temp.buf[s->temp.pos++] != 0x21) in dec_block_header()
546 if (s->temp.buf[s->temp.pos++] != 0x01) in dec_block_header()
550 if (s->temp.size - s->temp.pos < 1) in dec_block_header()
553 ret = xz_dec_lzma2_reset(s->lzma2, s->temp.buf[s->temp.pos++]); in dec_block_header()
558 while (s->temp.pos < s->temp.size) in dec_block_header()
559 if (s->temp.buf[s->temp.pos++] != 0x00) in dec_block_header()
562 s->temp.pos = 0; in dec_block_header()
563 s->block.compressed = 0; in dec_block_header()
564 s->block.uncompressed = 0; in dec_block_header()
569 static enum xz_ret dec_main(struct xz_dec *s, struct xz_buf *b) in dec_main() argument
577 s->in_start = b->in_pos; in dec_main()
580 switch (s->sequence) { in dec_main()
590 if (!fill_temp(s, b)) in dec_main()
600 s->sequence = SEQ_BLOCK_START; in dec_main()
602 ret = dec_stream_header(s); in dec_main()
615 s->in_start = b->in_pos++; in dec_main()
616 s->sequence = SEQ_INDEX; in dec_main()
624 s->block_header.size in dec_main()
627 s->temp.size = s->block_header.size; in dec_main()
628 s->temp.pos = 0; in dec_main()
629 s->sequence = SEQ_BLOCK_HEADER; in dec_main()
634 if (!fill_temp(s, b)) in dec_main()
637 ret = dec_block_header(s); in dec_main()
641 s->sequence = SEQ_BLOCK_UNCOMPRESS; in dec_main()
646 ret = dec_block(s, b); in dec_main()
650 s->sequence = SEQ_BLOCK_PADDING; in dec_main()
662 while (s->block.compressed & 3) { in dec_main()
669 ++s->block.compressed; in dec_main()
672 s->sequence = SEQ_BLOCK_CHECK; in dec_main()
677 if (s->check_type == XZ_CHECK_CRC32) { in dec_main()
678 ret = crc_validate(s, b, 32); in dec_main()
682 else if (IS_CRC64(s->check_type)) { in dec_main()
683 ret = crc_validate(s, b, 64); in dec_main()
688 else if (!check_skip(s, b)) { in dec_main()
693 s->sequence = SEQ_BLOCK_START; in dec_main()
697 ret = dec_index(s, b); in dec_main()
701 s->sequence = SEQ_INDEX_PADDING; in dec_main()
706 while ((s->index.size + (b->in_pos - s->in_start)) in dec_main()
709 index_update(s, b); in dec_main()
718 index_update(s, b); in dec_main()
721 if (!memeq(&s->block.hash, &s->index.hash, in dec_main()
722 sizeof(s->block.hash))) in dec_main()
725 s->sequence = SEQ_INDEX_CRC32; in dec_main()
730 ret = crc_validate(s, b, 32); in dec_main()
734 s->temp.size = STREAM_HEADER_SIZE; in dec_main()
735 s->sequence = SEQ_STREAM_FOOTER; in dec_main()
740 if (!fill_temp(s, b)) in dec_main()
743 return dec_stream_footer(s); in dec_main()
775 XZ_EXTERN enum xz_ret xz_dec_run(struct xz_dec *s, struct xz_buf *b) in xz_dec_run() argument
781 if (DEC_IS_SINGLE(s->mode)) in xz_dec_run()
782 xz_dec_reset(s); in xz_dec_run()
786 ret = dec_main(s, b); in xz_dec_run()
788 if (DEC_IS_SINGLE(s->mode)) { in xz_dec_run()
800 if (s->allow_buf_error) in xz_dec_run()
803 s->allow_buf_error = true; in xz_dec_run()
805 s->allow_buf_error = false; in xz_dec_run()
813 struct xz_dec *s = kmalloc(sizeof(*s), GFP_KERNEL); in xz_dec_init() local
814 if (s == NULL) in xz_dec_init()
817 s->mode = mode; in xz_dec_init()
820 s->bcj = xz_dec_bcj_create(DEC_IS_SINGLE(mode)); in xz_dec_init()
821 if (s->bcj == NULL) in xz_dec_init()
824 s->lzma2 = xz_dec_lzma2_create(mode, dict_max); in xz_dec_init()
825 if (s->lzma2 == NULL) in xz_dec_init()
827 xz_dec_reset(s); in xz_dec_init()
828 return s; in xz_dec_init()
832 xz_dec_bcj_end(s->bcj); in xz_dec_init()
835 kfree(s); in xz_dec_init()
839 XZ_EXTERN void xz_dec_reset(struct xz_dec *s) in xz_dec_reset() argument
841 s->sequence = SEQ_STREAM_HEADER; in xz_dec_reset()
842 s->allow_buf_error = false; in xz_dec_reset()
843 s->pos = 0; in xz_dec_reset()
844 s->crc = 0; in xz_dec_reset()
845 memzero(&s->block, sizeof(s->block)); in xz_dec_reset()
846 memzero(&s->index, sizeof(s->index)); in xz_dec_reset()
847 s->temp.pos = 0; in xz_dec_reset()
848 s->temp.size = STREAM_HEADER_SIZE; in xz_dec_reset()
851 XZ_EXTERN void xz_dec_end(struct xz_dec *s) in xz_dec_end() argument
853 if (s != NULL) { in xz_dec_end()
854 xz_dec_lzma2_end(s->lzma2); in xz_dec_end()
856 xz_dec_bcj_end(s->bcj); in xz_dec_end()
858 kfree(s); in xz_dec_end()