diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libressl/ressl.c | 44 | ||||
| -rw-r--r-- | src/lib/libressl/ressl.h | 3 |
2 files changed, 31 insertions, 16 deletions
diff --git a/src/lib/libressl/ressl.c b/src/lib/libressl/ressl.c index c4a1e42dfa..e014d3e572 100644 --- a/src/lib/libressl/ressl.c +++ b/src/lib/libressl/ressl.c | |||
| @@ -118,35 +118,47 @@ ressl_reset(struct ressl *ctx) | |||
| 118 | int | 118 | int |
| 119 | ressl_read(struct ressl *ctx, char *buf, size_t buflen, size_t *outlen) | 119 | ressl_read(struct ressl *ctx, char *buf, size_t buflen, size_t *outlen) |
| 120 | { | 120 | { |
| 121 | int ret; | 121 | int ret, ssl_err; |
| 122 | 122 | ||
| 123 | /* XXX - handle async/non-blocking. */ | ||
| 124 | ret = SSL_read(ctx->ssl_conn, buf, buflen); | 123 | ret = SSL_read(ctx->ssl_conn, buf, buflen); |
| 125 | if (ret <= 0) { | 124 | if (ret > 0) { |
| 126 | ret = SSL_get_error(ctx->ssl_conn, ret); | 125 | *outlen = (size_t)ret; |
| 127 | if (ret == SSL_ERROR_WANT_READ) | 126 | return (0); |
| 128 | return (-2); | 127 | } |
| 129 | ressl_set_error(ctx, "read failed: %i", ret); | 128 | |
| 129 | ssl_err = SSL_get_error(ctx->ssl_conn, ret); | ||
| 130 | switch (ssl_err) { | ||
| 131 | case SSL_ERROR_WANT_READ: | ||
| 132 | return (RESSL_READ_AGAIN); | ||
| 133 | case SSL_ERROR_WANT_WRITE: | ||
| 134 | return (RESSL_WRITE_AGAIN); | ||
| 135 | default: | ||
| 136 | ressl_set_error(ctx, "read failed (%i)", ssl_err); | ||
| 130 | return (-1); | 137 | return (-1); |
| 131 | } | 138 | } |
| 132 | *outlen = (size_t)ret; | ||
| 133 | return (0); | ||
| 134 | } | 139 | } |
| 135 | 140 | ||
| 136 | int | 141 | int |
| 137 | ressl_write(struct ressl *ctx, const char *buf, size_t buflen, size_t *outlen) | 142 | ressl_write(struct ressl *ctx, const char *buf, size_t buflen, size_t *outlen) |
| 138 | { | 143 | { |
| 139 | int ret; | 144 | int ret, ssl_err; |
| 140 | 145 | ||
| 141 | /* XXX - handle async/non-blocking. */ | ||
| 142 | ret = SSL_write(ctx->ssl_conn, buf, buflen); | 146 | ret = SSL_write(ctx->ssl_conn, buf, buflen); |
| 143 | if (ret < 0) { | 147 | if (ret > 0) { |
| 144 | ressl_set_error(ctx, "write failed %d", | 148 | *outlen = (size_t)ret; |
| 145 | SSL_get_error(ctx->ssl_conn, ret)); | 149 | return (0); |
| 150 | } | ||
| 151 | |||
| 152 | ssl_err = SSL_get_error(ctx->ssl_conn, ret); | ||
| 153 | switch (ssl_err) { | ||
| 154 | case SSL_ERROR_WANT_READ: | ||
| 155 | return (RESSL_READ_AGAIN); | ||
| 156 | case SSL_ERROR_WANT_WRITE: | ||
| 157 | return (RESSL_WRITE_AGAIN); | ||
| 158 | default: | ||
| 159 | ressl_set_error(ctx, "write failed (%i)", ssl_err); | ||
| 146 | return (-1); | 160 | return (-1); |
| 147 | } | 161 | } |
| 148 | *outlen = (size_t)ret; | ||
| 149 | return (0); | ||
| 150 | } | 162 | } |
| 151 | 163 | ||
| 152 | int | 164 | int |
diff --git a/src/lib/libressl/ressl.h b/src/lib/libressl/ressl.h index d4962f358b..10e3dc85ed 100644 --- a/src/lib/libressl/ressl.h +++ b/src/lib/libressl/ressl.h | |||
| @@ -17,6 +17,9 @@ | |||
| 17 | #ifndef HEADER_RESSL_H | 17 | #ifndef HEADER_RESSL_H |
| 18 | #define HEADER_RESSL_H | 18 | #define HEADER_RESSL_H |
| 19 | 19 | ||
| 20 | #define RESSL_READ_AGAIN -2 | ||
| 21 | #define RESSL_WRITE_AGAIN -3 | ||
| 22 | |||
| 20 | struct ressl; | 23 | struct ressl; |
| 21 | struct ressl_config; | 24 | struct ressl_config; |
| 22 | 25 | ||
