summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_pkt.c
diff options
context:
space:
mode:
authorjsing <>2021-08-28 15:20:58 +0000
committerjsing <>2021-08-28 15:20:58 +0000
commita2c46f1d53e00c1011b8aa4d2e8aa62a6c96426c (patch)
tree1ed1ecf4e3e1d27ff867656c73a42aba24803e15 /src/lib/libssl/ssl_pkt.c
parentacdf1e27755acce4396b8b736739aab883e4e88b (diff)
downloadopenbsd-a2c46f1d53e00c1011b8aa4d2e8aa62a6c96426c.tar.gz
openbsd-a2c46f1d53e00c1011b8aa4d2e8aa62a6c96426c.tar.bz2
openbsd-a2c46f1d53e00c1011b8aa4d2e8aa62a6c96426c.zip
Clean up and simplify ssl3_dispatch_alert() and ssl3_send_alert().
ok inoguchi@ tb@
Diffstat (limited to 'src/lib/libssl/ssl_pkt.c')
-rw-r--r--src/lib/libssl/ssl_pkt.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/src/lib/libssl/ssl_pkt.c b/src/lib/libssl/ssl_pkt.c
index 66c57b13a4..9aa71f7d4f 100644
--- a/src/lib/libssl/ssl_pkt.c
+++ b/src/lib/libssl/ssl_pkt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_pkt.c,v 1.48 2021/08/04 12:41:25 jsing Exp $ */ 1/* $OpenBSD: ssl_pkt.c,v 1.49 2021/08/28 15:20:58 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1203,51 +1203,53 @@ ssl3_write_alert(SSL *s)
1203int 1203int
1204ssl3_send_alert(SSL *s, int level, int desc) 1204ssl3_send_alert(SSL *s, int level, int desc)
1205{ 1205{
1206 /* If a fatal one, remove from cache */ 1206 /* If alert is fatal, remove session from cache. */
1207 if (level == SSL3_AL_FATAL) 1207 if (level == SSL3_AL_FATAL)
1208 SSL_CTX_remove_session(s->ctx, s->session); 1208 SSL_CTX_remove_session(s->ctx, s->session);
1209 1209
1210 S3I(s)->alert_dispatch = 1; 1210 S3I(s)->alert_dispatch = 1;
1211 S3I(s)->send_alert[0] = level; 1211 S3I(s)->send_alert[0] = level;
1212 S3I(s)->send_alert[1] = desc; 1212 S3I(s)->send_alert[1] = desc;
1213 if (S3I(s)->wbuf.left == 0) /* data still being written out? */
1214 return ssl3_dispatch_alert(s);
1215 1213
1216 /* else data is still being written out, we will get written 1214 /*
1217 * some time in the future */ 1215 * If data is still being written out, the alert will be dispatched at
1218 return -1; 1216 * some point in the future.
1217 */
1218 if (S3I(s)->wbuf.left != 0)
1219 return -1;
1220
1221 return ssl3_dispatch_alert(s);
1219} 1222}
1220 1223
1221int 1224int
1222ssl3_dispatch_alert(SSL *s) 1225ssl3_dispatch_alert(SSL *s)
1223{ 1226{
1224 int i, j; 1227 void (*cb)(const SSL *ssl, int type, int val);
1225 void (*cb)(const SSL *ssl, int type, int val) = NULL; 1228 int ret;
1226 1229
1227 S3I(s)->alert_dispatch = 0; 1230 S3I(s)->alert_dispatch = 0;
1228 i = ssl3_write_alert(s); 1231 if ((ret = ssl3_write_alert(s)) <= 0) {
1229 if (i <= 0) {
1230 S3I(s)->alert_dispatch = 1; 1232 S3I(s)->alert_dispatch = 1;
1231 } else { 1233 return ret;
1232 /* Alert sent to BIO. If it is important, flush it now. 1234 }
1233 * If the message does not get sent due to non-blocking IO,
1234 * we will not worry too much. */
1235 if (S3I(s)->send_alert[0] == SSL3_AL_FATAL)
1236 (void)BIO_flush(s->wbio);
1237 1235
1238 if (s->internal->msg_callback) 1236 /*
1239 s->internal->msg_callback(1, s->version, SSL3_RT_ALERT, 1237 * Alert sent to BIO. If it is important, flush it now.
1240 S3I(s)->send_alert, 2, s, s->internal->msg_callback_arg); 1238 * If the message does not get sent due to non-blocking IO,
1239 * we will not worry too much.
1240 */
1241 if (S3I(s)->send_alert[0] == SSL3_AL_FATAL)
1242 (void)BIO_flush(s->wbio);
1241 1243
1242 if (s->internal->info_callback != NULL) 1244 if (s->internal->msg_callback)
1243 cb = s->internal->info_callback; 1245 s->internal->msg_callback(1, s->version, SSL3_RT_ALERT,
1244 else if (s->ctx->internal->info_callback != NULL) 1246 S3I(s)->send_alert, 2, s, s->internal->msg_callback_arg);
1245 cb = s->ctx->internal->info_callback;
1246 1247
1247 if (cb != NULL) { 1248 if ((cb = s->internal->info_callback) == NULL)
1248 j = (S3I(s)->send_alert[0]<<8)|S3I(s)->send_alert[1]; 1249 cb = s->ctx->internal->info_callback;
1249 cb(s, SSL_CB_WRITE_ALERT, j); 1250 if (cb != NULL)
1250 } 1251 cb(s, SSL_CB_WRITE_ALERT, (S3I(s)->send_alert[0] << 8) |
1251 } 1252 S3I(s)->send_alert[1]);
1252 return (i); 1253
1254 return ret;
1253} 1255}