mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
Various comments and tweaks in bzip2 decoding.
Do not assume that memset(ptr, 0, size) clears pointers to NULL. The length of decoded data can be read in two ways; assert they match.
This commit is contained in:
parent
a75302caf2
commit
0e5b6af9b0
@ -20,29 +20,52 @@
|
|||||||
#include "encoding/encoding.h"
|
#include "encoding/encoding.h"
|
||||||
#include "util/memory.h"
|
#include "util/memory.h"
|
||||||
|
|
||||||
|
/* How many bytes of compressed data to read before decompressing.
|
||||||
|
* This is currently defined as BZ_MAX_UNUSED to make the behaviour
|
||||||
|
* similar to BZ2_bzRead; but other values would work too. */
|
||||||
#define ELINKS_BZ_BUFFER_LENGTH BZ_MAX_UNUSED
|
#define ELINKS_BZ_BUFFER_LENGTH BZ_MAX_UNUSED
|
||||||
|
|
||||||
struct bz2_enc_data {
|
struct bz2_enc_data {
|
||||||
bz_stream fbz_stream;
|
bz_stream fbz_stream;
|
||||||
|
|
||||||
|
/* The file descriptor from which we read. */
|
||||||
int fdread;
|
int fdread;
|
||||||
int last_read; /* If err after last bzDecompress was BZ_STREAM_END.. */
|
|
||||||
unsigned char buf[ELINKS_BZ_BUFFER_LENGTH]; /* must be the last */
|
/* Initially 0; set to 1 when BZ2_bzDecompress indicates
|
||||||
|
* BZ_STREAM_END, which means it has found the bzip2-specific
|
||||||
|
* end-of-stream marker and all data has been decompressed.
|
||||||
|
* Then we neither read from the file nor call BZ2_bzDecompress
|
||||||
|
* any more. */
|
||||||
|
int last_read;
|
||||||
|
|
||||||
|
/* A buffer for data that has been read from the file but not
|
||||||
|
* yet decompressed. fbz_stream.next_in and fbz_stream.avail_in
|
||||||
|
* refer to this buffer. */
|
||||||
|
unsigned char buf[ELINKS_BZ_BUFFER_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bzip2_open(struct stream_encoded *stream, int fd)
|
bzip2_open(struct stream_encoded *stream, int fd)
|
||||||
{
|
{
|
||||||
|
/* A zero-initialized bz_stream. The compiler ensures that all
|
||||||
|
* pointer members in it are null. (Can't do this with memset
|
||||||
|
* because C99 does not require all-bits-zero to be a null
|
||||||
|
* pointer.) */
|
||||||
|
static const bz_stream null_bz_stream = {0};
|
||||||
|
|
||||||
struct bz2_enc_data *data = mem_alloc(sizeof(*data));
|
struct bz2_enc_data *data = mem_alloc(sizeof(*data));
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
stream->data = 0;
|
stream->data = NULL;
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memset(data, 0, sizeof(struct bz2_enc_data) - ELINKS_BZ_BUFFER_LENGTH);
|
|
||||||
|
|
||||||
data->last_read = 0;
|
/* Initialize all members of *data, except data->buf[], which
|
||||||
|
* will be initialized on demand by bzip2_read. */
|
||||||
|
copy_struct(&data->fbz_stream, &null_bz_stream);
|
||||||
data->fdread = fd;
|
data->fdread = fd;
|
||||||
|
data->last_read = 0;
|
||||||
|
|
||||||
err = BZ2_bzDecompressInit(&data->fbz_stream, 0, 0);
|
err = BZ2_bzDecompressInit(&data->fbz_stream, 0, 0);
|
||||||
if (err != BZ_OK) {
|
if (err != BZ_OK) {
|
||||||
@ -97,7 +120,8 @@ bzip2_read(struct stream_encoded *stream, unsigned char *buf, int len)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} while (data->fbz_stream.avail_out > 0);
|
} while (data->fbz_stream.avail_out > 0);
|
||||||
|
|
||||||
|
assert(len - data->fbz_stream.avail_out == data->fbz_stream.next_out - (char *) buf);
|
||||||
return len - data->fbz_stream.avail_out;
|
return len - data->fbz_stream.avail_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user