SOURCES: elinks-bug517.patch (NEW) - fixed the bzip2 encoding

witekfl witekfl at pld-linux.org
Wed May 16 18:25:19 CEST 2007


Author: witekfl                      Date: Wed May 16 16:25:18 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- fixed the bzip2 encoding

---- Files affected:
SOURCES:
   elinks-bug517.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/elinks-bug517.patch
diff -u /dev/null SOURCES/elinks-bug517.patch:1.1
--- /dev/null	Wed May 16 18:25:18 2007
+++ SOURCES/elinks-bug517.patch	Wed May 16 18:25:12 2007
@@ -0,0 +1,179 @@
+diff --git a/AUTHORS b/AUTHORS
+index f65085d..b08ec55 100644
+--- a/AUTHORS
++++ b/AUTHORS
+@@ -215,6 +215,9 @@ Hugo Haas <hugo at larve.net>
+ 	Minor random hacking
+ 	debian/watch file
+ 
++<incoherent at mail.ru>
++	bzip2 decoding fix and rewrite
++
+ Ingo Blechschmidt <iblech at web.de>
+ 	German translation updates
+ 
+diff --git a/src/encoding/bzip2.c b/src/encoding/bzip2.c
+index 0291a39..c33b88e 100644
+--- a/src/encoding/bzip2.c
++++ b/src/encoding/bzip2.c
+@@ -12,6 +12,7 @@ #endif
+ #ifdef HAVE_BZLIB_H
+ #include <bzlib.h> /* Everything needs this after stdio.h */
+ #endif
++#include <errno.h>
+ 
+ #include "elinks.h"
+ 
+@@ -20,29 +21,32 @@ #include "encoding/encoding.h"
+ #include "util/memory.h"
+ 
+ 
++#define ELINKS_BZ_BUFFER_LENGTH BZ_MAX_UNUSED
++
+ struct bz2_enc_data {
+-	FILE *file;
+-	BZFILE *bzfile;
+-	int last_read; /* If err after last bzRead() was BZ_STREAM_END.. */
++	int fdread;
++	bz_stream fbz_stream;
++	int last_read; /* If err after last bzDecompress was BZ_STREAM_END.. */
++	unsigned char buf[ELINKS_BZ_BUFFER_LENGTH];
+ };
+ 
+-/* TODO: When it'll be official, use bzdopen() from Yoshioka Tsuneo. --pasky */
+-
+ static int
+ bzip2_open(struct stream_encoded *stream, int fd)
+ {
+ 	struct bz2_enc_data *data = mem_alloc(sizeof(*data));
+ 	int err;
+ 
++	stream->data = 0;
+ 	if (!data) {
+ 		return -1;
+ 	}
+-	data->last_read = 0;
+-
+-	data->file = fdopen(fd, "rb");
++	memset(data, 0, sizeof(struct bz2_enc_data) - ELINKS_BZ_BUFFER_LENGTH);
+ 
+-	data->bzfile = BZ2_bzReadOpen(&err, data->file, 0, 0, NULL, 0);
+-	if (!data->bzfile) {
++	data->last_read = 0;
++	data->fdread = fd;
++	
++	err = BZ2_bzDecompressInit(&data->fbz_stream, 0, 0);
++	if (err != BZ_OK) {
+ 		mem_free(data);
+ 		return -1;
+ 	}
+@@ -58,17 +62,44 @@ bzip2_read(struct stream_encoded *stream
+ 	struct bz2_enc_data *data = (struct bz2_enc_data *) stream->data;
+ 	int err = 0;
+ 
+-	if (data->last_read)
+-		return 0;
++	if (!data) return -1;
+ 
+-	len = BZ2_bzRead(&err, data->bzfile, buf, len);
++	assert(len > 0);	
+ 
+-	if (err == BZ_STREAM_END)
+-		data->last_read = 1;
+-	else if (err)
+-		return -1;
++	if (data->last_read) return 0;
++
++	data->fbz_stream.avail_out = len;
++	data->fbz_stream.next_out = buf;
++
++	do {	
++		if (data->fbz_stream.avail_in == 0) {
++			int l = safe_read(data->fdread, data->buf,
++			                  ELINKS_BZ_BUFFER_LENGTH);
+ 
+-	return len;
++			if (l == -1) {
++				if (errno == EAGAIN)
++					break;
++				else
++					return -1; /* I/O error */
++			} else if (l == 0) {
++				/* EOF. It is error: we wait for more bytes */
++				return -1;
++			}
++
++			data->fbz_stream.next_in = data->buf;
++			data->fbz_stream.avail_in = l;
++		}
++		
++		err = BZ2_bzDecompress(&data->fbz_stream);
++		if (err == BZ_STREAM_END) { 
++			data->last_read = 1;
++			break;
++		} else if (err != BZ_OK) { 
++			return -1;
++		}
++	} while (data->fbz_stream.avail_out > 0);
++	
++	return len - data->fbz_stream.avail_out;
+ }
+ 
+ static unsigned char *
+@@ -148,11 +179,13 @@ static void
+ bzip2_close(struct stream_encoded *stream)
+ {
+ 	struct bz2_enc_data *data = (struct bz2_enc_data *) stream->data;
+-	int err;
+ 
+-	BZ2_bzReadClose(&err, data->bzfile);
+-	fclose(data->file);
+-	mem_free(data);
++	if (data) {
++		BZ2_bzDecompressEnd(&data->fbz_stream);
++		close(data->fdread);
++		mem_free(data);
++		stream->data = 0;
++	}
+ }
+ 
+ static unsigned char *bzip2_extensions[] = { ".bz2", ".tbz", NULL };
+diff --git a/src/protocol/http/http.c b/src/protocol/http/http.c
+index 87d468d..6f7469f 100644
+--- a/src/protocol/http/http.c
++++ b/src/protocol/http/http.c
+@@ -720,20 +720,13 @@ http_send_header(struct socket *socket)
+ #if defined(CONFIG_GZIP) || defined(CONFIG_BZIP2)
+ 	add_to_string(&header, "Accept-Encoding: ");
+ 
+-#ifdef BUG_517
+ #ifdef CONFIG_BZIP2
+ 	add_to_string(&header, "bzip2");
+ #endif
+-#endif
+-
+ #ifdef CONFIG_GZIP
+-
+-#ifdef BUG_517
+ #ifdef CONFIG_BZIP2
+ 	add_to_string(&header, ", ");
+ #endif
+-#endif
+-
+ 	add_to_string(&header, "gzip");
+ #endif
+ 	add_crlf_to_string(&header);
+@@ -1810,13 +1803,11 @@ #ifdef CONFIG_GZIP
+ 		    && (!strcasecmp(d, "gzip") || !strcasecmp(d, "x-gzip")))
+ 		    	conn->content_encoding = ENCODING_GZIP;
+ #endif
+-#ifdef BUG_517
+ #ifdef CONFIG_BZIP2
+ 		if (file_encoding != ENCODING_BZIP2
+ 		    && (!strcasecmp(d, "bzip2") || !strcasecmp(d, "x-bzip2")))
+ 			conn->content_encoding = ENCODING_BZIP2;
+ #endif
+-#endif
+ 		mem_free(d);
+ 	}
+ 
================================================================


More information about the pld-cvs-commit mailing list