adium 5880:5a28350c3d82: Really fix #16356: After calling SSLRea...

commits at adium.im commits at adium.im
Tue Jun 3 19:07:50 UTC 2014


details:	http://hg.adium.im/adium/rev/5a28350c3d82
revision:	5880:5a28350c3d82
branch:		adium-1.5.11
author:		Thijs Alkemade <me at thijsalkema.de>
date:		Tue Jun 03 21:04:55 2014 +0200

Really fix #16356: After calling SSLRead, first check if any bytes have actually been processed. If that's true, then ignore any error that might have been returned. This actually matches the semantics of read. It feels weird to ignore errors, especially when dealing with TLS, but this seems to match the implementation of SSLRead.

diffs (50 lines):

diff -r e9b20f65795c -r 5a28350c3d82 Plugins/Purple Service/libpurple_extensions/ssl-cdsa.c
--- a/Plugins/Purple Service/libpurple_extensions/ssl-cdsa.c	Mon May 26 13:10:47 2014 +0200
+++ b/Plugins/Purple Service/libpurple_extensions/ssl-cdsa.c	Tue Jun 03 21:04:55 2014 +0200
@@ -634,26 +634,30 @@
 {
 	PurpleSslCDSAData *cdsa_data = PURPLE_SSL_CDSA_DATA(gsc);
 	OSStatus	err;			/* Error info */
-	size_t		processed;		/* Number of bytes processed */
+	size_t		processed = 0;		/* Number of bytes processed */
 	size_t		result;			/* Return value */
 
     errno = 0;
     err = SSLRead(cdsa_data->ssl_ctx, data, len, &processed);
-	switch (err) {
-		case noErr:
-			result = processed;
-			break;
-		case errSSLWouldBlock:
-			errno = EAGAIN;
-			result = ((processed > 0) ? processed : -1);
-			break;
-		case errSSLClosedGraceful:
-			result = 0;
-			break;
-		default:
-			result = -1;
-			purple_debug_error("cdsa", "receive failed (%d): %s\n", (int)err, strerror(errno));
-			break;
+	if (processed <= 0) {
+		switch (err) {
+			case noErr:
+				result = processed;
+				break;
+			case errSSLWouldBlock:
+				errno = EAGAIN;
+				result = ((processed > 0) ? processed : -1);
+				break;
+			case errSSLClosedGraceful:
+				result = 0;
+				break;
+			default:
+				result = -1;
+				purple_debug_error("cdsa", "receive failed (%d): %s\n", (int)err, strerror(errno));
+				break;
+		}
+	} else {
+		result = processed;
 	}
 
     return result;




More information about the commits mailing list