- The CVS server hangs because it assumes the compressed input length requested will be available from the underlying stream, which is almost always necessarily shorter due to compression. Fixed by requesting one byte at a time. (bsc#1257000) * fix-broken-zlib.c-implementation.patch OBS-URL: https://build.opensuse.org/request/show/1331719 OBS-URL: https://build.opensuse.org/package/show/devel:tools:scm/cvs?expand=0&rev=47
47 lines
1.8 KiB
Diff
47 lines
1.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Derek Robert Price <derek@ximbiot.com>
|
|
Date: Fri, 28 Oct 2005 16:10:59 +0200
|
|
Subject: [PATCH] Fix broken zlib.c implementation
|
|
|
|
* zlib.c (compress_bufer_input): Don't assume the number of bytes the
|
|
caller requested will be available from the stream underlying the
|
|
compression buffer - the data is compressed and should be shorter by
|
|
definition. Improve comment.
|
|
|
|
Fixes: https://savannah.nongnu.org/bugs/?14840
|
|
Reported-by: Rahul Bhargava <rahul@wandisco.com>
|
|
Upstream-Status: Backport [1.12.14]
|
|
[iluceno@suse.de: Patch normalized]
|
|
Signed-off-by: Ismael Luceno <iluceno@suse.de>
|
|
---
|
|
zlib.c | 15 +++++++--------
|
|
1 file changed, 7 insertions(+), 8 deletions(-)
|
|
|
|
RCS file: /sources/cvs/ccvs/src/zlib.c,v
|
|
diff -u -r1.31 -r1.32
|
|
--- a/src/zlib.c
|
|
+++ b/src/zlib.c
|
|
@@ -221,15 +221,14 @@
|
|
point. */
|
|
assert (bd->size == 0);
|
|
|
|
- /* This will work well in the server, because this call will
|
|
- do an unblocked read and fetch all the available data. In
|
|
- the client, this will read a single byte from the stdio
|
|
- stream, which will cause us to call inflate once per byte.
|
|
- It would be more efficient if we could make a call which
|
|
- would fetch all the available bytes, and at least one byte. */
|
|
-
|
|
+ /* On the server, this will do an unblocking read of as much data as is
|
|
+ * available. On the client, with a blocking input descriptor and the
|
|
+ * current fd_buffer implementation, this should read as much data as
|
|
+ * is currently available, and at least 1 byte (or EOF), from the
|
|
+ * underlying buffer.
|
|
+ */
|
|
status = (*cb->buf->input) (cb->buf->closure, bd->text,
|
|
- need, BUFFER_DATA_SIZE, &nread);
|
|
+ need ? 1 : 0, BUFFER_DATA_SIZE, &nread);
|
|
|
|
if (status == -2)
|
|
/* Don't try to recover from memory allcoation errors. */
|