aboutsummaryrefslogtreecommitdiff
path: root/linux/lib/xz/xz_dec_bcj.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/lib/xz/xz_dec_bcj.c')
-rw-r--r--linux/lib/xz/xz_dec_bcj.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/linux/lib/xz/xz_dec_bcj.c b/linux/lib/xz/xz_dec_bcj.c
index f053cfd..f5b25f1 100644
--- a/linux/lib/xz/xz_dec_bcj.c
+++ b/linux/lib/xz/xz_dec_bcj.c
@@ -28,6 +28,9 @@ struct xz_dec_bcj {
*/
enum xz_ret ret;
+ /* True if we are operating in single-call mode. */
+ bool single_call;
+
/*
* Absolute position relative to the beginning of the uncompressed
* data (in a single .xz Block). We care only about the lowest 32
@@ -441,7 +444,8 @@ XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_bcj_run(struct xz_dec_bcj *s,
b->out_pos += s->temp.size;
s->ret = xz_dec_lzma2_run(lzma2, b);
- if (s->ret != XZ_OK && s->ret != XZ_STREAM_END)
+ if (s->ret != XZ_STREAM_END
+ && (s->ret != XZ_OK || s->single_call))
return s->ret;
bcj_apply(s, b->out, &out_start, b->out_pos);
@@ -503,9 +507,12 @@ XZ_EXTERN enum xz_ret XZ_FUNC xz_dec_bcj_run(struct xz_dec_bcj *s,
return s->ret;
}
-XZ_EXTERN struct xz_dec_bcj * XZ_FUNC xz_dec_bcj_create(void)
+XZ_EXTERN struct xz_dec_bcj * XZ_FUNC xz_dec_bcj_create(bool single_call)
{
struct xz_dec_bcj *s = kmalloc(sizeof(*s), GFP_KERNEL);
+ if (s != NULL)
+ s->single_call = single_call;
+
return s;
}