diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2012-04-10 11:14:58 +0200 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2012-04-10 11:14:58 +0200 | 
| commit | 632f3d45178f0d2810df934c32828a00912900de (patch) | |
| tree | a6909311fdb87bc6dd01a9a49f0077a96553d8bb /lib | |
| parent | 9b767e914297ca82051afec66a6dc20a4452a20b (diff) | |
Work-around for what turned out to be a GnuTLS bug (#938). From 3.0.13
until 3.0.18 gnutls_record_check_pending() returns non-0 even if the data
read so far is an incomplete record and can not yet be read. This can get
BitlBee's http_client stuck in a semi-infinite loop.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ssl_gnutls.c | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/lib/ssl_gnutls.c b/lib/ssl_gnutls.c index 62932e86..93601ba6 100644 --- a/lib/ssl_gnutls.c +++ b/lib/ssl_gnutls.c @@ -68,6 +68,11 @@ static gboolean ssl_handshake( gpointer data, gint source, b_input_condition con  static void ssl_deinit( void ); +static void ssl_log( int level, const char *line ) +{ +	printf( "%d %s", level, line ); +} +  void ssl_init( void )  {  	if( initialized ) @@ -84,6 +89,11 @@ void ssl_init( void )  	}  	initialized = TRUE; +	gnutls_global_set_log_function( ssl_log ); +	/* +	gnutls_global_set_log_level( 3 ); +	*/ +	  	atexit( ssl_deinit );  } @@ -366,6 +376,11 @@ int ssl_pending( void *conn )  		ssl_errno = SSL_NOHANDSHAKE;  		return 0;  	} + +#if GNUTLS_VERSION_NUMBER >= 0x03000d && GNUTLS_VERSION_NUMBER <= 0x030012 +	if( ssl_errno == SSL_AGAIN ) +		return 0; +#endif  	return gnutls_record_check_pending( ((struct scd*)conn)->session ) != 0;  } | 
