diff options
author | jsing <> | 2015-04-15 16:08:43 +0000 |
---|---|---|
committer | jsing <> | 2015-04-15 16:08:43 +0000 |
commit | 304dc978f4617f2656dad35305db42599e6b3c72 (patch) | |
tree | 3cd20258e0378ecd5c66a1f533c8323464a98762 /src | |
parent | dcb31e966f316332772152f9dc4003581bf31395 (diff) | |
download | openbsd-304dc978f4617f2656dad35305db42599e6b3c72.tar.gz openbsd-304dc978f4617f2656dad35305db42599e6b3c72.tar.bz2 openbsd-304dc978f4617f2656dad35305db42599e6b3c72.zip |
Treat SSL_ERROR_ZERO_RETURN as a success, rather than a failure. Also
ensure that outlen is set to zero so that tls_read() has read(2) like
semantics for EOF.
Spotted by doug@
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libtls/tls.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index 002cccda5f..f4bd108dac 100644 --- a/src/lib/libtls/tls.c +++ b/src/lib/libtls/tls.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls.c,v 1.10 2015/04/15 16:05:23 jsing Exp $ */ | 1 | /* $OpenBSD: tls.c,v 1.11 2015/04/15 16:08:43 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -246,11 +246,8 @@ tls_ssl_error(struct tls *ctx, SSL *ssl_conn, int ssl_ret, const char *prefix) | |||
246 | ssl_err = SSL_get_error(ssl_conn, ssl_ret); | 246 | ssl_err = SSL_get_error(ssl_conn, ssl_ret); |
247 | switch (ssl_err) { | 247 | switch (ssl_err) { |
248 | case SSL_ERROR_NONE: | 248 | case SSL_ERROR_NONE: |
249 | return (0); | ||
250 | |||
251 | case SSL_ERROR_ZERO_RETURN: | 249 | case SSL_ERROR_ZERO_RETURN: |
252 | tls_set_error(ctx, "%s failed: TLS connection closed", prefix); | 250 | return (0); |
253 | return (-1); | ||
254 | 251 | ||
255 | case SSL_ERROR_WANT_READ: | 252 | case SSL_ERROR_WANT_READ: |
256 | return (TLS_READ_AGAIN); | 253 | return (TLS_READ_AGAIN); |
@@ -301,6 +298,8 @@ tls_read(struct tls *ctx, void *buf, size_t buflen, size_t *outlen) | |||
301 | return (0); | 298 | return (0); |
302 | } | 299 | } |
303 | 300 | ||
301 | *outlen = 0; | ||
302 | |||
304 | return tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "read"); | 303 | return tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "read"); |
305 | } | 304 | } |
306 | 305 | ||
@@ -320,6 +319,8 @@ tls_write(struct tls *ctx, const void *buf, size_t buflen, size_t *outlen) | |||
320 | return (0); | 319 | return (0); |
321 | } | 320 | } |
322 | 321 | ||
322 | *outlen = 0; | ||
323 | |||
323 | return tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "write"); | 324 | return tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "write"); |
324 | } | 325 | } |
325 | 326 | ||