diff options
author | jsing <> | 2014-08-04 15:55:26 +0000 |
---|---|---|
committer | jsing <> | 2014-08-04 15:55:26 +0000 |
commit | 5ba06d1e6f1d7f0d7316856cdf4b22225fa45513 (patch) | |
tree | 185b0353ee0de6a8728885b3003214d886e30ee5 /src/lib | |
parent | 690f32e905567843e1fe02b180d57fce0aaa8b71 (diff) | |
download | openbsd-5ba06d1e6f1d7f0d7316856cdf4b22225fa45513.tar.gz openbsd-5ba06d1e6f1d7f0d7316856cdf4b22225fa45513.tar.bz2 openbsd-5ba06d1e6f1d7f0d7316856cdf4b22225fa45513.zip |
Improve ressl_{read,write} handling of non-blocking reads/writes.
Diffstat (limited to 'src/lib')
-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 | ||