diff options
| author | Idan Freiberg <speidy@gmail.com> | 2015-06-12 10:55:16 +0300 |
|---|---|---|
| committer | Idan Freiberg <speidy@gmail.com> | 2015-06-12 10:55:16 +0300 |
| commit | 2a8209ca8b21499529afe250aae3dd189dcefbe1 (patch) | |
| tree | 8e06abdfbd4fb83b55261ab92ec406f8e6099310 | |
| parent | 9fb02e381de377414526003b5d998573d10e55f7 (diff) | |
| parent | cd6ab20e947a0bad468c9a57f09555f64ce81eef (diff) | |
| download | xrdp-proprietary-2a8209ca8b21499529afe250aae3dd189dcefbe1.tar.gz xrdp-proprietary-2a8209ca8b21499529afe250aae3dd189dcefbe1.zip | |
Merge pull request #249 from metalefty/freebsd/tls
common: fix #248 TLS on FreeBSD
| -rw-r--r-- | common/ssl_calls.c | 110 |
1 files changed, 75 insertions, 35 deletions
diff --git a/common/ssl_calls.c b/common/ssl_calls.c index ae30fe71..7bc33fcb 100644 --- a/common/ssl_calls.c +++ b/common/ssl_calls.c @@ -562,11 +562,7 @@ ssl_tls_print_error(char *func, SSL *connection, int value) return 1; case SSL_ERROR_WANT_READ: - g_writeln("ssl_tls_print_error: SSL_ERROR_WANT_READ"); - return 0; - case SSL_ERROR_WANT_WRITE: - g_writeln("ssl_tls_print_error: SSL_ERROR_WANT_WRITE"); return 0; case SSL_ERROR_SYSCALL: @@ -669,13 +665,24 @@ ssl_tls_accept(struct ssl_tls *self) return 1; } - connection_status = SSL_accept(self->ssl); + while(1) { + connection_status = SSL_accept(self->ssl); - if (connection_status <= 0) - { - if (ssl_tls_print_error("SSL_accept", self->ssl, connection_status)) + if (connection_status <= 0) { - return 1; + if (ssl_tls_print_error("SSL_accept", self->ssl, connection_status)) + { + return 1; + } + /** + * retry when SSL_get_error returns: + * SSL_ERROR_WANT_READ + * SSL_ERROR_WANT_WRITE + */ + } + else + { + break; } } @@ -709,6 +716,11 @@ ssl_tls_disconnect(struct ssl_tls *self) { return 1; } + /** + * retry when SSL_get_error returns: + * SSL_ERROR_WANT_READ + * SSL_ERROR_WANT_WRITE + */ } } return 0; @@ -737,23 +749,37 @@ int APP_CC ssl_tls_read(struct ssl_tls *tls, char *data, int length) { int status; + int break_flag; - status = SSL_read(tls->ssl, data, length); - - switch (SSL_get_error(tls->ssl, status)) - { - case SSL_ERROR_NONE: - break; + while(1) { + status = SSL_read(tls->ssl, data, length); - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - status = 0; - break; + switch (SSL_get_error(tls->ssl, status)) + { + case SSL_ERROR_NONE: + break_flag = 1; + break; + + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + /** + * retry when SSL_get_error returns: + * SSL_ERROR_WANT_READ + * SSL_ERROR_WANT_WRITE + */ + continue; + + default: + ssl_tls_print_error("SSL_read", tls->ssl, status); + status = -1; + break_flag = 1; + break; + } - default: - ssl_tls_print_error("SSL_read", tls->ssl, status); - status = -1; + if (break_flag) + { break; + } } if (SSL_pending(tls->ssl) > 0) @@ -769,23 +795,37 @@ int APP_CC ssl_tls_write(struct ssl_tls *tls, const char *data, int length) { int status; + int break_flag; - status = SSL_write(tls->ssl, data, length); - - switch (SSL_get_error(tls->ssl, status)) - { - case SSL_ERROR_NONE: - break; + while(1) { + status = SSL_write(tls->ssl, data, length); - case SSL_ERROR_WANT_READ: - case SSL_ERROR_WANT_WRITE: - status = 0; - break; + switch (SSL_get_error(tls->ssl, status)) + { + case SSL_ERROR_NONE: + break_flag = 1; + break; + + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + /** + * retry when SSL_get_error returns: + * SSL_ERROR_WANT_READ + * SSL_ERROR_WANT_WRITE + */ + continue; + + default: + ssl_tls_print_error("SSL_write", tls->ssl, status); + status = -1; + break_flag = 1; + break; + } - default: - ssl_tls_print_error("SSL_write", tls->ssl, status); - status = -1; + if (break_flag) + { break; + } } return status; |
