diff options
author | jsing <> | 2015-09-12 19:54:31 +0000 |
---|---|---|
committer | jsing <> | 2015-09-12 19:54:31 +0000 |
commit | b23c8f0c7e56fd5c6e99bcad0ec4f4a085be2d6a (patch) | |
tree | 6d7005f84ef8db59b7b30dd91562d159028dd12d /src/lib/libtls/tls.c | |
parent | 20f4bd301fadc705b6737e3b7fcac043b8ffb21a (diff) | |
download | openbsd-b23c8f0c7e56fd5c6e99bcad0ec4f4a085be2d6a.tar.gz openbsd-b23c8f0c7e56fd5c6e99bcad0ec4f4a085be2d6a.tar.bz2 openbsd-b23c8f0c7e56fd5c6e99bcad0ec4f4a085be2d6a.zip |
Ensure that we clear the libssl error stack before we make a function call
that we will pass the result through tls_ssl_error() on failure. Otherwise
we can end up reporting spurious errors due to their being unrelated errors
already on the error stack.
Spotted by Marko Kreen.
ok beck@
Diffstat (limited to 'src/lib/libtls/tls.c')
-rw-r--r-- | src/lib/libtls/tls.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index aa49641ab2..65103f106d 100644 --- a/src/lib/libtls/tls.c +++ b/src/lib/libtls/tls.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls.c,v 1.25 2015/09/11 09:24:54 jsing Exp $ */ | 1 | /* $OpenBSD: tls.c,v 1.26 2015/09/12 19:54:31 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -405,12 +405,13 @@ tls_read(struct tls *ctx, void *buf, size_t buflen) | |||
405 | goto out; | 405 | goto out; |
406 | } | 406 | } |
407 | 407 | ||
408 | ERR_clear_error(); | ||
408 | if ((ssl_ret = SSL_read(ctx->ssl_conn, buf, buflen)) > 0) { | 409 | if ((ssl_ret = SSL_read(ctx->ssl_conn, buf, buflen)) > 0) { |
409 | rv = (ssize_t)ssl_ret; | 410 | rv = (ssize_t)ssl_ret; |
410 | goto out; | 411 | goto out; |
411 | } | 412 | } |
412 | |||
413 | rv = (ssize_t)tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "read"); | 413 | rv = (ssize_t)tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "read"); |
414 | |||
414 | out: | 415 | out: |
415 | /* Prevent callers from performing incorrect error handling */ | 416 | /* Prevent callers from performing incorrect error handling */ |
416 | errno = 0; | 417 | errno = 0; |
@@ -433,12 +434,13 @@ tls_write(struct tls *ctx, const void *buf, size_t buflen) | |||
433 | goto out; | 434 | goto out; |
434 | } | 435 | } |
435 | 436 | ||
437 | ERR_clear_error(); | ||
436 | if ((ssl_ret = SSL_write(ctx->ssl_conn, buf, buflen)) > 0) { | 438 | if ((ssl_ret = SSL_write(ctx->ssl_conn, buf, buflen)) > 0) { |
437 | rv = (ssize_t)ssl_ret; | 439 | rv = (ssize_t)ssl_ret; |
438 | goto out; | 440 | goto out; |
439 | } | 441 | } |
440 | |||
441 | rv = (ssize_t)tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "write"); | 442 | rv = (ssize_t)tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "write"); |
443 | |||
442 | out: | 444 | out: |
443 | /* Prevent callers from performing incorrect error handling */ | 445 | /* Prevent callers from performing incorrect error handling */ |
444 | errno = 0; | 446 | errno = 0; |
@@ -452,6 +454,7 @@ tls_close(struct tls *ctx) | |||
452 | int rv = 0; | 454 | int rv = 0; |
453 | 455 | ||
454 | if (ctx->ssl_conn != NULL) { | 456 | if (ctx->ssl_conn != NULL) { |
457 | ERR_clear_error(); | ||
455 | ssl_ret = SSL_shutdown(ctx->ssl_conn); | 458 | ssl_ret = SSL_shutdown(ctx->ssl_conn); |
456 | if (ssl_ret < 0) { | 459 | if (ssl_ret < 0) { |
457 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, | 460 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, |