Fix logic determining which stat members are known / valid.
diff --git a/lib/zip_source_compress.c b/lib/zip_source_compress.c index 37e0318..0b97f93 100644 --- a/lib/zip_source_compress.c +++ b/lib/zip_source_compress.c
@@ -43,7 +43,7 @@ bool end_of_input; bool end_of_stream; bool can_store; - bool is_stored; + bool is_stored; /* only valid if end_of_stream is true */ bool compress; zip_int32_t method; @@ -158,6 +158,9 @@ ctx->algorithm = algorithm; ctx->method = method; ctx->compress = compress; + ctx->end_of_input = false; + ctx->end_of_stream = false; + ctx->is_stored = false; if ((ctx->ud = ctx->algorithm->allocate(ZIP_CM_ACTUAL(method), compression_flags, &ctx->error)) == NULL) { zip_error_fini(&ctx->error); @@ -325,17 +328,18 @@ st = (zip_stat_t *)data; if (ctx->compress) { - st->comp_method = ctx->is_stored ? ZIP_CM_STORE : ZIP_CM_ACTUAL(ctx->method); if (ctx->end_of_stream) { + st->comp_method = ctx->is_stored ? ZIP_CM_STORE : ZIP_CM_ACTUAL(ctx->method); st->comp_size = ctx->size; - st->valid |= ZIP_STAT_COMP_SIZE; + st->valid |= ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD; } else { - st->valid &= ~ZIP_STAT_COMP_SIZE; + st->valid &= ~(ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD); } } else { st->comp_method = ZIP_CM_STORE; + st->valid |= ZIP_STAT_COMP_METHOD; if (ctx->end_of_stream) { st->size = ctx->size; st->valid |= ZIP_STAT_SIZE; @@ -344,7 +348,6 @@ st->valid &= ~ZIP_STAT_SIZE; } } - st->valid |= ZIP_STAT_COMP_METHOD; } return 0;