adium/adium

Parents e9b20f65795c
Children 5a62e233115d
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.
--- 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;