diff --git a/gnutls-1.6.3-compress.patch b/gnutls-1.6.3-compress.patch new file mode 100644 index 0000000..abfb2a3 --- /dev/null +++ b/gnutls-1.6.3-compress.patch @@ -0,0 +1,132 @@ +diff -up gnutls-1.6.3/lib/gnutls_cipher.c.compress gnutls-1.6.3/lib/gnutls_cipher.c +--- gnutls-1.6.3/lib/gnutls_cipher.c.compress 2008-06-20 15:49:08.000000000 +0200 ++++ gnutls-1.6.3/lib/gnutls_cipher.c 2008-06-20 15:54:15.000000000 +0200 +@@ -91,7 +91,7 @@ _gnutls_encrypt (gnutls_session_t sessio + /* Here comp is allocated and must be + * freed. + */ +- ret = _gnutls_m_plaintext2compressed (session, &comp, plain); ++ ret = _gnutls_m_plaintext2compressed (session, &comp, &plain); + if (ret < 0) + { + gnutls_assert (); +@@ -160,20 +160,20 @@ _gnutls_decrypt (gnutls_session_t sessio + + gcomp.data = data; + gcomp.size = ret; +- ret = _gnutls_m_compressed2plaintext (session, >xt, gcomp); ++ ret = _gnutls_m_compressed2plaintext (session, >xt, &gcomp); + if (ret < 0) + { + return ret; + } + +- if (gtxt.size > max_data_size) ++ if (gtxt.size > MAX_RECORD_RECV_SIZE) + { + gnutls_assert (); + _gnutls_free_datum (>xt); + /* This shouldn't have happen and + * is a TLS fatal error. + */ +- return GNUTLS_E_INTERNAL_ERROR; ++ return GNUTLS_E_DECOMPRESSION_FAILED; + } + + memcpy (data, gtxt.data, gtxt.size); +diff -up gnutls-1.6.3/lib/gnutls_record.c.compress gnutls-1.6.3/lib/gnutls_record.c +--- gnutls-1.6.3/lib/gnutls_record.c.compress 2006-11-16 15:11:11.000000000 +0100 ++++ gnutls-1.6.3/lib/gnutls_record.c 2008-06-20 15:54:15.000000000 +0200 +@@ -778,13 +778,19 @@ record_check_type (gnutls_session_t sess + inline static int + get_temp_recv_buffer (gnutls_session_t session, gnutls_datum_t * tmp) + { ++size_t max_record_size; ++ ++ if (gnutls_compression_get(session) != GNUTLS_COMP_NULL) ++ max_record_size = MAX_RECORD_RECV_SIZE + EXTRA_COMP_SIZE; ++ else ++ max_record_size = MAX_RECORD_RECV_SIZE; + + /* We allocate MAX_RECORD_RECV_SIZE length + * because we cannot predict the output data by the record + * packet length (due to compression). + */ + +- if (MAX_RECORD_RECV_SIZE > session->internals.recv_buffer.size || ++ if (max_record_size > session->internals.recv_buffer.size || + session->internals.recv_buffer.data == NULL) + { + +@@ -792,7 +798,7 @@ get_temp_recv_buffer (gnutls_session_t s + */ + session->internals.recv_buffer.data = + gnutls_realloc (session->internals.recv_buffer.data, +- MAX_RECORD_RECV_SIZE); ++ max_record_size); + + if (session->internals.recv_buffer.data == NULL) + { +@@ -800,7 +806,7 @@ get_temp_recv_buffer (gnutls_session_t s + return GNUTLS_E_MEMORY_ERROR; + } + +- session->internals.recv_buffer.size = MAX_RECORD_RECV_SIZE; ++ session->internals.recv_buffer.size = max_record_size; + } + + tmp->data = session->internals.recv_buffer.data; +diff -up gnutls-1.6.3/lib/gnutls_compress.h.compress gnutls-1.6.3/lib/gnutls_compress.h +--- gnutls-1.6.3/lib/gnutls_compress.h.compress 2006-03-08 11:44:59.000000000 +0100 ++++ gnutls-1.6.3/lib/gnutls_compress.h 2008-06-20 15:54:15.000000000 +0200 +@@ -24,7 +24,7 @@ + + int _gnutls_m_plaintext2compressed (gnutls_session_t session, + gnutls_datum_t * compressed, +- gnutls_datum_t plaintext); ++ const gnutls_datum_t *plaintext); + int _gnutls_m_compressed2plaintext (gnutls_session_t session, + gnutls_datum_t * plain, +- gnutls_datum_t compressed); ++ const gnutls_datum_t* compressed); +diff -up gnutls-1.6.3/lib/gnutls_compress.c.compress gnutls-1.6.3/lib/gnutls_compress.c +--- gnutls-1.6.3/lib/gnutls_compress.c.compress 2006-03-08 11:44:59.000000000 +0100 ++++ gnutls-1.6.3/lib/gnutls_compress.c 2008-06-20 15:57:53.000000000 +0200 +@@ -36,15 +36,15 @@ + int + _gnutls_m_plaintext2compressed (gnutls_session_t session, + gnutls_datum_t * compressed, +- gnutls_datum_t plaintext) ++ const gnutls_datum_t *plaintext) + { + int size; + opaque *data; + + size = + _gnutls_compress (session->connection_state.write_compression_state, +- plaintext.data, plaintext.size, &data, +- MAX_RECORD_SEND_SIZE + 1024); ++ plaintext->data, plaintext->size, &data, ++ MAX_RECORD_SEND_SIZE + EXTRA_COMP_SIZE); + if (size < 0) + { + gnutls_assert (); +@@ -59,15 +59,15 @@ _gnutls_m_plaintext2compressed (gnutls_s + int + _gnutls_m_compressed2plaintext (gnutls_session_t session, + gnutls_datum_t * plain, +- gnutls_datum_t compressed) ++ const gnutls_datum_t* compressed) + { + int size; + opaque *data; + + size = + _gnutls_decompress (session->connection_state. +- read_compression_state, compressed.data, +- compressed.size, &data, MAX_RECORD_RECV_SIZE); ++ read_compression_state, compressed->data, ++ compressed->size, &data, MAX_RECORD_RECV_SIZE); + if (size < 0) + { + gnutls_assert (); diff --git a/gnutls.spec b/gnutls.spec index 823621a..cf1b275 100644 --- a/gnutls.spec +++ b/gnutls.spec @@ -1,7 +1,7 @@ Summary: A TLS protocol implementation Name: gnutls Version: 1.6.3 -Release: 3%{?dist} +Release: 4%{?dist} # The libgnutls library is LGPLv2+, utilities and remaining libraries are GPLv2+ License: GPLv2+ and LGPLv2+ Group: System Environment/Libraries @@ -19,6 +19,7 @@ Patch0: gnutls-1.4.0-nosrp.patch Patch1: gnutls-1.4.1-enable-psk.patch Patch2: gnutls-1.6.3-incompat-pointers.patch Patch4: gnutls-1.4.1-sa-2008-1.patch +Patch5: gnutls-1.6.3-compress.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: libgcrypt >= 1.2.2 @@ -63,6 +64,7 @@ manipulation tools. %patch1 -p1 -b .enable-psk %patch2 -p1 -b .incompat %patch4 -p1 -b .sa-2008-1 +%patch5 -p1 -b .compress for i in auth_srp_rsa.c auth_srp_sb64.c auth_srp_passwd.c auth_srp.c gnutls_srp.c ext_srp.c; do touch lib/$i @@ -129,6 +131,9 @@ fi %{_mandir}/man1/* %changelog +* Fri Jun 20 2008 Tomas Mraz 1.6.3-4 +- backported fix for compression support (#451952) + * Tue May 20 2008 Tomas Mraz 1.6.3-3 - fix three security issues in gnutls handshake - GNUTLS-SA-2008-1 (#447461, #447462, #447463)