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 | |
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')
-rw-r--r-- | src/lib/libtls/tls.c | 9 | ||||
-rw-r--r-- | src/lib/libtls/tls_client.c | 4 | ||||
-rw-r--r-- | src/lib/libtls/tls_server.c | 4 |
3 files changed, 12 insertions, 5 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, |
diff --git a/src/lib/libtls/tls_client.c b/src/lib/libtls/tls_client.c index 2aca519f8b..047831e59f 100644 --- a/src/lib/libtls/tls_client.c +++ b/src/lib/libtls/tls_client.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_client.c,v 1.27 2015/09/11 12:56:55 beck Exp $ */ | 1 | /* $OpenBSD: tls_client.c,v 1.28 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 | * |
@@ -25,6 +25,7 @@ | |||
25 | #include <stdlib.h> | 25 | #include <stdlib.h> |
26 | #include <unistd.h> | 26 | #include <unistd.h> |
27 | 27 | ||
28 | #include <openssl/err.h> | ||
28 | #include <openssl/x509.h> | 29 | #include <openssl/x509.h> |
29 | 30 | ||
30 | #include <tls.h> | 31 | #include <tls.h> |
@@ -251,6 +252,7 @@ tls_handshake_client(struct tls *ctx) | |||
251 | goto err; | 252 | goto err; |
252 | } | 253 | } |
253 | 254 | ||
255 | ERR_clear_error(); | ||
254 | if ((ssl_ret = SSL_connect(ctx->ssl_conn)) != 1) { | 256 | if ((ssl_ret = SSL_connect(ctx->ssl_conn)) != 1) { |
255 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); | 257 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); |
256 | goto err; | 258 | goto err; |
diff --git a/src/lib/libtls/tls_server.c b/src/lib/libtls/tls_server.c index 69baf5c1c2..1baf717c90 100644 --- a/src/lib/libtls/tls_server.c +++ b/src/lib/libtls/tls_server.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_server.c,v 1.16 2015/09/11 08:31:26 beck Exp $ */ | 1 | /* $OpenBSD: tls_server.c,v 1.17 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 | * |
@@ -16,6 +16,7 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <openssl/ec.h> | 18 | #include <openssl/ec.h> |
19 | #include <openssl/err.h> | ||
19 | #include <openssl/ssl.h> | 20 | #include <openssl/ssl.h> |
20 | 21 | ||
21 | #include <tls.h> | 22 | #include <tls.h> |
@@ -167,6 +168,7 @@ tls_handshake_server(struct tls *ctx) | |||
167 | goto err; | 168 | goto err; |
168 | } | 169 | } |
169 | 170 | ||
171 | ERR_clear_error(); | ||
170 | if ((ssl_ret = SSL_accept(ctx->ssl_conn)) != 1) { | 172 | if ((ssl_ret = SSL_accept(ctx->ssl_conn)) != 1) { |
171 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); | 173 | rv = tls_ssl_error(ctx, ctx->ssl_conn, ssl_ret, "handshake"); |
172 | goto err; | 174 | goto err; |