aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2017-11-09 16:15:41 +0100
committerErlang/OTP <[email protected]>2017-11-09 16:15:41 +0100
commit8ceee73b703976cdc09687b4c0efcf2c490c3954 (patch)
treea463ea75d7f8c2f4756d9f5860b2c6b5955b05f9
parent0a3d5ad6f2dec30f450e1a29f1150a139cd4777f (diff)
parent9b1f2439845e5627a00fb816244af06d77c2d70a (diff)
downloadotp-8ceee73b703976cdc09687b4c0efcf2c490c3954.tar.gz
otp-8ceee73b703976cdc09687b4c0efcf2c490c3954.tar.bz2
otp-8ceee73b703976cdc09687b4c0efcf2c490c3954.zip
Merge branch 'john/erts/fix-gunzip-eos/OTP-14730/ERL-507' into maint-20
* john/erts/fix-gunzip-eos/OTP-14730/ERL-507: Only apply EOS behaviors if there's pending data
-rw-r--r--erts/emulator/nifs/common/zlib_nif.c5
-rw-r--r--lib/kernel/test/zlib_SUITE.erl5
2 files changed, 7 insertions, 3 deletions
diff --git a/erts/emulator/nifs/common/zlib_nif.c b/erts/emulator/nifs/common/zlib_nif.c
index 9565a5a059..b709ed5a6f 100644
--- a/erts/emulator/nifs/common/zlib_nif.c
+++ b/erts/emulator/nifs/common/zlib_nif.c
@@ -946,7 +946,7 @@ static ERL_NIF_TERM zlib_inflate(ErlNifEnv *env, int argc, const ERL_NIF_TERM ar
return enif_raise_exception(env, am_not_initialized);
}
- if(d->eos_seen) {
+ if(d->eos_seen && enif_ioq_size(d->input_queue) > 0) {
int res;
switch(d->eos_behavior) {
@@ -960,11 +960,10 @@ static ERL_NIF_TERM zlib_inflate(ErlNifEnv *env, int argc, const ERL_NIF_TERM ar
}
d->eos_seen = 0;
+
break;
case EOS_BEHAVIOR_CUT:
zlib_reset_input(d);
-
- return enif_make_tuple2(env, am_finished, enif_make_list(env, 0));
}
}
diff --git a/lib/kernel/test/zlib_SUITE.erl b/lib/kernel/test/zlib_SUITE.erl
index 6d4e21b8cf..26602bdcda 100644
--- a/lib/kernel/test/zlib_SUITE.erl
+++ b/lib/kernel/test/zlib_SUITE.erl
@@ -686,6 +686,11 @@ api_g_un_zip(Config) when is_list(Config) ->
Concatenated = <<Bin/binary, Bin/binary>>,
?m(Concatenated, zlib:gunzip([Comp, Comp])),
+ %% Don't explode if the uncompressed size is a perfect multiple of the
+ %% internal inflate chunk size.
+ ChunkSizedData = <<0:16384/unit:8>>,
+ ?m(ChunkSizedData, zlib:gunzip(zlib:gzip(ChunkSizedData))),
+
%% Bad CRC; bad length.
BadCrc = bad_crc_data(),
?m(?EXIT(data_error),(catch zlib:gunzip(BadCrc))),