From 99a32242b364793076b4b03310c435d4828ef6e4 Mon Sep 17 00:00:00 2001 From: Lars Magne Ingebrigtsen Date: Sun, 11 Aug 2013 22:51:47 +0200 Subject: [PATCH] Fix decompress gap handling bug * decompress.c (Fdecompress_gzipped_region): Respect all zlib errors, and really move the gap to where we want it. --- src/ChangeLog | 3 +++ src/decompress.c | 10 ++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 340e8407b3..1780bf4e79 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,8 @@ 2013-08-11 Lars Magne Ingebrigtsen + * decompress.c (Fdecompress_gzipped_region): Respect all zlib + errors, and really move the gap to where we want it. + * lisp.h: Include decompress.c support. * emacs.c (main): Include decompress.c support. diff --git a/src/decompress.c b/src/decompress.c index 18f7884a4c..a6323a843e 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -63,7 +63,6 @@ This function can only be called in unibyte buffers.*/) ptrdiff_t count = SPECPDL_INDEX (); validate_region (&start, &end); - move_gap_both (iend, iend); if (! NILP (BVAR (current_buffer, enable_multibyte_characters))) error ("This function can only be called in unibyte buffers"); @@ -72,6 +71,7 @@ This function can only be called in unibyte buffers.*/) the same. */ istart = XINT (start); iend = XINT (end); + move_gap_both (iend, iend); stream.zalloc = Z_NULL; stream.zfree = Z_NULL; @@ -99,13 +99,11 @@ This function can only be called in unibyte buffers.*/) /* Run inflate() on input until the output buffer isn't full. */ do { + int result; stream.avail_out = BUFFER_SIZE; stream.next_out = out; - switch (inflate (&stream, Z_NO_FLUSH)) { - case Z_STREAM_ERROR: - case Z_NEED_DICT: - case Z_DATA_ERROR: - case Z_MEM_ERROR: + result = inflate (&stream, Z_NO_FLUSH); + if (result < 0) { unbind_to (count, Qnil); return Qnil; } -- 2.20.1