diff options
author | beck <> | 2020-01-24 04:36:29 +0000 |
---|---|---|
committer | beck <> | 2020-01-24 04:36:29 +0000 |
commit | 9bdb8cf2b0cdef5430b92da746812d02b3e4a0db (patch) | |
tree | 1e380b51c8b8b1ef639f72f8967a2a3aab5f9349 /src/lib | |
parent | 7136a54d43d7b515b6d9043faeb359a87cf1ab0f (diff) | |
download | openbsd-9bdb8cf2b0cdef5430b92da746812d02b3e4a0db.tar.gz openbsd-9bdb8cf2b0cdef5430b92da746812d02b3e4a0db.tar.bz2 openbsd-9bdb8cf2b0cdef5430b92da746812d02b3e4a0db.zip |
Fix breakage in SSL_connect, SSL_accept, etc. by not propagating
new retry conditions from the record layer all the way up to the
callers. Instead we catch them at the top of the record layer
and retry the operations, unless we actually got a retry indicated
from actual IO operations.
ok jsing@ tb@
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libssl/tls13_internal.h | 5 | ||||
-rw-r--r-- | src/lib/libssl/tls13_lib.c | 6 | ||||
-rw-r--r-- | src/lib/libssl/tls13_record_layer.c | 44 |
3 files changed, 42 insertions, 13 deletions
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h index e9f629f387..7b3670bf45 100644 --- a/src/lib/libssl/tls13_internal.h +++ b/src/lib/libssl/tls13_internal.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_internal.h,v 1.50 2020/01/23 11:57:20 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_internal.h,v 1.51 2020/01/24 04:36:29 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> |
4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> |
@@ -36,7 +36,8 @@ __BEGIN_HIDDEN_DECLS | |||
36 | #define TLS13_IO_ALERT -2 | 36 | #define TLS13_IO_ALERT -2 |
37 | #define TLS13_IO_WANT_POLLIN -3 | 37 | #define TLS13_IO_WANT_POLLIN -3 |
38 | #define TLS13_IO_WANT_POLLOUT -4 | 38 | #define TLS13_IO_WANT_POLLOUT -4 |
39 | #define TLS13_IO_USE_LEGACY -5 | 39 | #define TLS13_IO_WANT_RETRY -5 /* Retry the previous call immediately. */ |
40 | #define TLS13_IO_USE_LEGACY -6 | ||
40 | 41 | ||
41 | #define TLS13_ERR_VERIFY_FAILED 16 | 42 | #define TLS13_ERR_VERIFY_FAILED 16 |
42 | #define TLS13_ERR_HRR_FAILED 17 | 43 | #define TLS13_ERR_HRR_FAILED 17 |
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c index 473163ee76..cfe3985050 100644 --- a/src/lib/libssl/tls13_lib.c +++ b/src/lib/libssl/tls13_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_lib.c,v 1.26 2020/01/23 11:57:20 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_lib.c,v 1.27 2020/01/24 04:36:29 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> |
@@ -420,6 +420,10 @@ tls13_legacy_return_code(SSL *ssl, ssize_t ret) | |||
420 | BIO_set_retry_write(ssl->wbio); | 420 | BIO_set_retry_write(ssl->wbio); |
421 | ssl->internal->rwstate = SSL_WRITING; | 421 | ssl->internal->rwstate = SSL_WRITING; |
422 | return -1; | 422 | return -1; |
423 | |||
424 | case TLS13_IO_WANT_RETRY: | ||
425 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
426 | return -1; | ||
423 | } | 427 | } |
424 | 428 | ||
425 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | 429 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); |
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c index aa8968484b..e5f8ba8859 100644 --- a/src/lib/libssl/tls13_record_layer.c +++ b/src/lib/libssl/tls13_record_layer.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_record_layer.c,v 1.24 2020/01/23 05:08:30 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_record_layer.c,v 1.25 2020/01/24 04:36:29 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -274,7 +274,7 @@ tls13_record_layer_process_alert(struct tls13_record_layer *rl) | |||
274 | ret = TLS13_IO_EOF; | 274 | ret = TLS13_IO_EOF; |
275 | } else if (alert_desc == SSL_AD_USER_CANCELLED) { | 275 | } else if (alert_desc == SSL_AD_USER_CANCELLED) { |
276 | /* Ignored at the record layer. */ | 276 | /* Ignored at the record layer. */ |
277 | ret = TLS13_IO_WANT_POLLIN; | 277 | ret = TLS13_IO_WANT_RETRY; |
278 | } else if (alert_level == SSL3_AL_FATAL) { | 278 | } else if (alert_level == SSL3_AL_FATAL) { |
279 | rl->read_closed = 1; | 279 | rl->read_closed = 1; |
280 | rl->write_closed = 1; | 280 | rl->write_closed = 1; |
@@ -330,7 +330,7 @@ tls13_record_layer_send_phh(struct tls13_record_layer *rl) | |||
330 | if (!CBS_skip(&rl->phh_cbs, ret)) | 330 | if (!CBS_skip(&rl->phh_cbs, ret)) |
331 | return TLS13_IO_FAILURE; | 331 | return TLS13_IO_FAILURE; |
332 | if (CBS_len(&rl->phh_cbs) != 0) | 332 | if (CBS_len(&rl->phh_cbs) != 0) |
333 | return TLS13_IO_WANT_POLLOUT; | 333 | return TLS13_IO_WANT_RETRY; |
334 | 334 | ||
335 | freezero(rl->phh_data, rl->phh_len); | 335 | freezero(rl->phh_data, rl->phh_len); |
336 | rl->phh_data = NULL; | 336 | rl->phh_data = NULL; |
@@ -776,7 +776,7 @@ tls13_record_layer_read_record(struct tls13_record_layer *rl) | |||
776 | return tls13_send_alert(rl, SSL_AD_ILLEGAL_PARAMETER); | 776 | return tls13_send_alert(rl, SSL_AD_ILLEGAL_PARAMETER); |
777 | rl->ccs_seen = 1; | 777 | rl->ccs_seen = 1; |
778 | tls13_record_layer_rrec_free(rl); | 778 | tls13_record_layer_rrec_free(rl); |
779 | return TLS13_IO_WANT_POLLIN; | 779 | return TLS13_IO_WANT_RETRY; |
780 | } | 780 | } |
781 | 781 | ||
782 | /* | 782 | /* |
@@ -896,7 +896,7 @@ tls13_record_layer_read_internal(struct tls13_record_layer *rl, | |||
896 | rl->phh = 0; | 896 | rl->phh = 0; |
897 | 897 | ||
898 | if (ret == TLS13_IO_SUCCESS) | 898 | if (ret == TLS13_IO_SUCCESS) |
899 | return TLS13_IO_WANT_POLLIN; | 899 | return TLS13_IO_WANT_RETRY; |
900 | 900 | ||
901 | return ret; | 901 | return ret; |
902 | } | 902 | } |
@@ -929,14 +929,26 @@ ssize_t | |||
929 | tls13_record_layer_peek(struct tls13_record_layer *rl, uint8_t content_type, | 929 | tls13_record_layer_peek(struct tls13_record_layer *rl, uint8_t content_type, |
930 | uint8_t *buf, size_t n) | 930 | uint8_t *buf, size_t n) |
931 | { | 931 | { |
932 | return tls13_record_layer_read_internal(rl, content_type, buf, n, 1); | 932 | ssize_t ret; |
933 | |||
934 | do { | ||
935 | ret = tls13_record_layer_read_internal(rl, content_type, buf, n, 1); | ||
936 | } while (ret == TLS13_IO_WANT_RETRY); | ||
937 | |||
938 | return ret; | ||
933 | } | 939 | } |
934 | 940 | ||
935 | ssize_t | 941 | ssize_t |
936 | tls13_record_layer_read(struct tls13_record_layer *rl, uint8_t content_type, | 942 | tls13_record_layer_read(struct tls13_record_layer *rl, uint8_t content_type, |
937 | uint8_t *buf, size_t n) | 943 | uint8_t *buf, size_t n) |
938 | { | 944 | { |
939 | return tls13_record_layer_read_internal(rl, content_type, buf, n, 0); | 945 | ssize_t ret; |
946 | |||
947 | do { | ||
948 | ret = tls13_record_layer_read_internal(rl, content_type, buf, n, 0); | ||
949 | } while (ret == TLS13_IO_WANT_RETRY); | ||
950 | |||
951 | return ret; | ||
940 | } | 952 | } |
941 | 953 | ||
942 | static ssize_t | 954 | static ssize_t |
@@ -1015,10 +1027,17 @@ tls13_record_layer_write(struct tls13_record_layer *rl, uint8_t content_type, | |||
1015 | { | 1027 | { |
1016 | ssize_t ret; | 1028 | ssize_t ret; |
1017 | 1029 | ||
1018 | if ((ret = tls13_record_layer_send_pending(rl)) != TLS13_IO_SUCCESS) | 1030 | do { |
1031 | ret = tls13_record_layer_send_pending(rl); | ||
1032 | } while (ret == TLS13_IO_WANT_RETRY); | ||
1033 | if (ret != TLS13_IO_SUCCESS) | ||
1019 | return ret; | 1034 | return ret; |
1020 | 1035 | ||
1021 | return tls13_record_layer_write_chunk(rl, content_type, buf, n); | 1036 | do { |
1037 | ret = tls13_record_layer_write_chunk(rl, content_type, buf, n); | ||
1038 | } while (ret == TLS13_IO_WANT_RETRY); | ||
1039 | |||
1040 | return ret; | ||
1022 | } | 1041 | } |
1023 | 1042 | ||
1024 | ssize_t | 1043 | ssize_t |
@@ -1075,10 +1094,15 @@ ssize_t | |||
1075 | tls13_send_alert(struct tls13_record_layer *rl, uint8_t alert_desc) | 1094 | tls13_send_alert(struct tls13_record_layer *rl, uint8_t alert_desc) |
1076 | { | 1095 | { |
1077 | uint8_t alert_level = SSL3_AL_FATAL; | 1096 | uint8_t alert_level = SSL3_AL_FATAL; |
1097 | ssize_t ret; | ||
1078 | 1098 | ||
1079 | if (alert_desc == SSL_AD_CLOSE_NOTIFY || | 1099 | if (alert_desc == SSL_AD_CLOSE_NOTIFY || |
1080 | alert_desc == SSL_AD_USER_CANCELLED) | 1100 | alert_desc == SSL_AD_USER_CANCELLED) |
1081 | alert_level = SSL3_AL_WARNING; | 1101 | alert_level = SSL3_AL_WARNING; |
1082 | 1102 | ||
1083 | return tls13_record_layer_alert(rl, alert_level, alert_desc); | 1103 | do { |
1104 | ret = tls13_record_layer_alert(rl, alert_level, alert_desc); | ||
1105 | } while (ret == TLS13_IO_WANT_RETRY); | ||
1106 | |||
1107 | return ret; | ||
1084 | } | 1108 | } |