summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2014-08-04 15:55:26 +0000
committerjsing <>2014-08-04 15:55:26 +0000
commit5ba06d1e6f1d7f0d7316856cdf4b22225fa45513 (patch)
tree185b0353ee0de6a8728885b3003214d886e30ee5 /src/lib
parent690f32e905567843e1fe02b180d57fce0aaa8b71 (diff)
downloadopenbsd-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.c44
-rw-r--r--src/lib/libressl/ressl.h3
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)
118int 118int
119ressl_read(struct ressl *ctx, char *buf, size_t buflen, size_t *outlen) 119ressl_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
136int 141int
137ressl_write(struct ressl *ctx, const char *buf, size_t buflen, size_t *outlen) 142ressl_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
152int 164int
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
20struct ressl; 23struct ressl;
21struct ressl_config; 24struct ressl_config;
22 25