summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2015-09-12 19:54:31 +0000
committerjsing <>2015-09-12 19:54:31 +0000
commitb23c8f0c7e56fd5c6e99bcad0ec4f4a085be2d6a (patch)
tree6d7005f84ef8db59b7b30dd91562d159028dd12d /src/lib
parent20f4bd301fadc705b6737e3b7fcac043b8ffb21a (diff)
downloadopenbsd-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.c9
-rw-r--r--src/lib/libtls/tls_client.c4
-rw-r--r--src/lib/libtls/tls_server.c4
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;