Files
cvs/fix-broken-zlib.c-implementation.patch
Valentin Lefebvre 83fa10825f Accepting request 1331719 from home:vlefebvre:branches:devel:tools:scm
- 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
2026-02-06 16:37:54 +00:00

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. */