diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/d1_pkt.c | 57 |
1 files changed, 19 insertions, 38 deletions
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c index 4e773a42bb..0416ee9c59 100644 --- a/src/lib/libssl/d1_pkt.c +++ b/src/lib/libssl/d1_pkt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: d1_pkt.c,v 1.102 2021/07/21 07:51:12 jsing Exp $ */ | 1 | /* $OpenBSD: d1_pkt.c,v 1.103 2021/07/21 08:42:14 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
| 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
| @@ -274,34 +274,23 @@ dtls1_retrieve_buffered_record(SSL *s, record_pqueue *queue) | |||
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | static int | 276 | static int |
| 277 | dtls1_process_buffered_records(SSL *s) | 277 | dtls1_process_buffered_record(SSL *s) |
| 278 | { | 278 | { |
| 279 | pitem *item; | 279 | /* Check if epoch is current. */ |
| 280 | if (D1I(s)->unprocessed_rcds.epoch != D1I(s)->r_epoch) | ||
| 281 | return (0); | ||
| 280 | 282 | ||
| 281 | item = pqueue_peek(D1I(s)->unprocessed_rcds.q); | 283 | /* Update epoch once all unprocessed records have been processed. */ |
| 282 | if (item) { | 284 | if (pqueue_peek(D1I(s)->unprocessed_rcds.q) == NULL) { |
| 283 | /* Check if epoch is current. */ | 285 | D1I(s)->unprocessed_rcds.epoch = D1I(s)->r_epoch + 1; |
| 284 | if (D1I(s)->unprocessed_rcds.epoch != D1I(s)->r_epoch) | 286 | return (0); |
| 285 | return (1); | ||
| 286 | /* Nothing to do. */ | ||
| 287 | |||
| 288 | /* Process all the records. */ | ||
| 289 | while (pqueue_peek(D1I(s)->unprocessed_rcds.q)) { | ||
| 290 | if (!dtls1_retrieve_buffered_record((s), | ||
| 291 | &((D1I(s))->unprocessed_rcds))) | ||
| 292 | return (0); | ||
| 293 | if (!dtls1_process_record(s)) | ||
| 294 | return (0); | ||
| 295 | if (dtls1_buffer_record(s, &(D1I(s)->processed_rcds), | ||
| 296 | S3I(s)->rrec.seq_num) < 0) | ||
| 297 | return (-1); | ||
| 298 | } | ||
| 299 | } | 287 | } |
| 300 | 288 | ||
| 301 | /* sync epoch numbers once all the unprocessed records | 289 | /* Process one of the records. */ |
| 302 | * have been processed */ | 290 | if (!dtls1_retrieve_buffered_record(s, &D1I(s)->unprocessed_rcds)) |
| 303 | D1I(s)->processed_rcds.epoch = D1I(s)->r_epoch; | 291 | return (-1); |
| 304 | D1I(s)->unprocessed_rcds.epoch = D1I(s)->r_epoch + 1; | 292 | if (!dtls1_process_record(s)) |
| 293 | return (-1); | ||
| 305 | 294 | ||
| 306 | return (1); | 295 | return (1); |
| 307 | } | 296 | } |
| @@ -365,22 +354,15 @@ dtls1_process_record(SSL *s) | |||
| 365 | int | 354 | int |
| 366 | dtls1_get_record(SSL *s) | 355 | dtls1_get_record(SSL *s) |
| 367 | { | 356 | { |
| 368 | SSL3_RECORD_INTERNAL *rr; | 357 | SSL3_RECORD_INTERNAL *rr = &(S3I(s)->rrec); |
| 369 | unsigned char *p = NULL; | 358 | unsigned char *p = NULL; |
| 370 | DTLS1_BITMAP *bitmap; | 359 | DTLS1_BITMAP *bitmap; |
| 371 | unsigned int is_next_epoch; | 360 | unsigned int is_next_epoch; |
| 372 | int n; | 361 | int ret, n; |
| 373 | 362 | ||
| 374 | rr = &(S3I(s)->rrec); | 363 | /* See if there are pending records that can now be processed. */ |
| 375 | 364 | if ((ret = dtls1_process_buffered_record(s)) != 0) | |
| 376 | /* The epoch may have changed. If so, process all the | 365 | return (ret); |
| 377 | * pending records. This is a non-blocking operation. */ | ||
| 378 | if (dtls1_process_buffered_records(s) < 0) | ||
| 379 | return (-1); | ||
| 380 | |||
| 381 | /* if we're renegotiating, then there may be buffered records */ | ||
| 382 | if (dtls1_retrieve_buffered_record((s), &((D1I(s))->processed_rcds))) | ||
| 383 | return 1; | ||
| 384 | 366 | ||
| 385 | /* get something from the wire */ | 367 | /* get something from the wire */ |
| 386 | if (0) { | 368 | if (0) { |
| @@ -1189,7 +1171,6 @@ dtls1_dispatch_alert(SSL *s) | |||
| 1189 | return (i); | 1171 | return (i); |
| 1190 | } | 1172 | } |
| 1191 | 1173 | ||
| 1192 | |||
| 1193 | static DTLS1_BITMAP * | 1174 | static DTLS1_BITMAP * |
| 1194 | dtls1_get_bitmap(SSL *s, SSL3_RECORD_INTERNAL *rr, unsigned int *is_next_epoch) | 1175 | dtls1_get_bitmap(SSL *s, SSL3_RECORD_INTERNAL *rr, unsigned int *is_next_epoch) |
| 1195 | { | 1176 | { |
