Commit 03427d4e authored by Max Kellermann's avatar Max Kellermann

archive/bz2: simplified error handling, short read

Don't attempt to fill the whole buffer in the read() method, return whatever libbz2 provides with the first successful BZ2_bzDecompress().
parent a627a703
sisyphus 0.23.15-alt1 0.23.14-alt1 0.23.13-alt1 0.23.12-alt1 0.23.11-alt1 0.23.8-alt3 0.23.8-alt2 0.23.8-alt1 0.21.24-alt1.1 0.21.24-alt1 0.20.23-alt3 0.20.23-alt2 0.20.23-alt1 0.20.21-alt1 0.20.15-alt1 0.18.14-alt1 0.18.11-alt1.1 0.18.11-alt1 0.18.10-alt1 0.17.0-alt0.3.git050212 0.17.0-alt0.2.git200911 0.17.0-alt0.2.M60P.1.git050212 0.17.0-alt0.1 0.16.2-alt2 0.16.2-alt1 v0.18.14 v0.18.13 v0.18.12 v0.18.11 v0.18.10 v0.18.9 v0.18.8 v0.18.7 v0.18.6 v0.18.5 v0.18.4 v0.18.3 v0.18.2 v0.17.3 v0.17.2 v0.17.1 v0.17.0-git200911 v0.17.0-git200711 v0.17.0-git050212 v0.16.8 v0.16.5 v0.16.4 v0.16.3 v0.16.2 v0.16.1 v0.16 v0.16_alpha4 v0.16_alpha3 v0.16_alpha2 release-0.16.5 release-0.16.4 release-0.16.3 release-0.16.1 release-0.16 release-0.16_alpha4 release-0.16_alpha3 release-0.16_alpha2 mpd/0.20.6-alt1 mpd/0.19.9-alt1 mpd/0.18.14-alt2 gb-sisyphus-task339776.6100 gb-sisyphus-task337393.100 gb-sisyphus-task337176.300 gb-sisyphus-task334590.100 gb-sisyphus-task333607.100 gb-sisyphus-task331543.2500 gb-sisyphus-task328663.4700 gb-sisyphus-task325064.100 gb-sisyphus-task319111.4000 gb-sisyphus-task313704.100 gb-sisyphus-task312885.100 gb-sisyphus-task308905.3200 gb-sisyphus-task305294.500 gb-sisyphus-task304007.100 gb-sisyphus-task303674.1700 gb-sisyphus-task298681.300 gb-sisyphus-task296051.1000 gb-sisyphus-task274827.100 gb-sisyphus-task269249.2000 gb-sisyphus-task266579.400 gb-sisyphus-task258132.600 gb-sisyphus-task254601.200 gb-sisyphus-task253310.100 gb-sisyphus-task252214.300 gb-sisyphus-task251539.6100 gb-sisyphus-task247988.7000 gb-sisyphus-task238768.6000 gb-sisyphus-task229151.100 gb-sisyphus-task227574.200 gb-sisyphus-task226762.6000 gb-sisyphus-task219546.1700 gb-sisyphus-task213491.100 gb-sisyphus-task198806.100 gb-sisyphus-task181400.100 gb-sisyphus-task141957.100 gb-sisyphus-task135039.100 gb-sisyphus-task130102.100 gb-sisyphus-task129023.100 gb-sisyphus-task127959.100 gb-sisyphus-task118591.100 gb-p9-task277538.2600 gb-c9f2-task327704.1100 fixed-0.17.0-git200911 alt-0.17.0-git200711 alt-0.17.0-git050212 alt-0.16.2
No related merge requests found
......@@ -42,8 +42,9 @@ typedef struct {
char *name;
bool reset;
struct input_stream istream;
int last_bz_result;
int last_parent_result;
bool eof;
bz_stream bzstream;
char *buffer;
} bz2_context;
......@@ -69,8 +70,6 @@ bz2_alloc(bz2_context *data)
return false;
}
data->last_bz_result = BZ_OK;
data->last_parent_result = 0;
return true;
}
......@@ -169,6 +168,8 @@ bz2_open_stream(struct archive_file *file, struct input_stream *is,
return false;
}
context->eof = false;
return true;
}
......@@ -183,7 +184,7 @@ bz2_is_close(struct input_stream *is)
}
static bool
bz2_fillbuffer(bz2_context *context, size_t length)
bz2_fillbuffer(bz2_context *context)
{
size_t count;
bz_stream *bzstream;
......@@ -195,18 +196,11 @@ bz2_fillbuffer(bz2_context *context, size_t length)
count = input_stream_read(&context->istream,
context->buffer, BZ_BUFSIZE);
if (count == 0)
return false;
if (count == 0) {
if (bzstream->avail_out == length)
return false;
if (!input_stream_eof(&context->istream))
context->last_parent_result = 1;
} else {
bzstream->next_in = context->buffer;
bzstream->avail_in = count;
}
bzstream->next_in = context->buffer;
bzstream->avail_in = count;
return true;
}
......@@ -218,32 +212,31 @@ bz2_is_read(struct input_stream *is, void *ptr, size_t length)
int bz_result;
size_t nbytes = 0;
if (context->last_bz_result != BZ_OK)
return 0;
if (context->last_parent_result != 0)
if (context->eof)
return 0;
bzstream = &context->bzstream;
bzstream->next_out = ptr;
bzstream->avail_out = length;
while (bzstream->avail_out != 0) {
if (!bz2_fillbuffer(context, length))
break;
do {
if (!bz2_fillbuffer(context)) {
is->error = -1;
return 0;
}
bz_result = BZ2_bzDecompress(bzstream);
if (context->last_bz_result != BZ_OK
&& bzstream->avail_out == length) {
context->last_bz_result = bz_result;
if (bz_result == BZ_STREAM_END) {
context->eof = true;
break;
}
if (bz_result == BZ_STREAM_END) {
context->last_bz_result = bz_result;
break;
if (bz_result != BZ_OK) {
is->error = bz_result;
return 0;
}
}
} while (bzstream->avail_out == length);
nbytes = length - bzstream->avail_out;
is->offset += nbytes;
......@@ -256,11 +249,7 @@ bz2_is_eof(struct input_stream *is)
{
bz2_context *context = (bz2_context *) is->data;
if (context->last_bz_result == BZ_STREAM_END) {
return true;
}
return false;
return context->eof;
}
/* exported structures */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment