diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/src/ssl/d1_both.c | 26 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/t1_lib.c | 14 |
2 files changed, 27 insertions, 13 deletions
diff --git a/src/lib/libssl/src/ssl/d1_both.c b/src/lib/libssl/src/ssl/d1_both.c index de8bab873f..436ab67b7a 100644 --- a/src/lib/libssl/src/ssl/d1_both.c +++ b/src/lib/libssl/src/ssl/d1_both.c | |||
| @@ -1452,26 +1452,36 @@ dtls1_process_heartbeat(SSL *s) | |||
| 1452 | unsigned int payload; | 1452 | unsigned int payload; |
| 1453 | unsigned int padding = 16; /* Use minimum padding */ | 1453 | unsigned int padding = 16; /* Use minimum padding */ |
| 1454 | 1454 | ||
| 1455 | /* Read type and payload length first */ | ||
| 1456 | hbtype = *p++; | ||
| 1457 | n2s(p, payload); | ||
| 1458 | pl = p; | ||
| 1459 | |||
| 1460 | if (s->msg_callback) | 1455 | if (s->msg_callback) |
| 1461 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, | 1456 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, |
| 1462 | &s->s3->rrec.data[0], s->s3->rrec.length, | 1457 | &s->s3->rrec.data[0], s->s3->rrec.length, |
| 1463 | s, s->msg_callback_arg); | 1458 | s, s->msg_callback_arg); |
| 1464 | 1459 | ||
| 1460 | /* Read type and payload length first */ | ||
| 1461 | if (1 + 2 + 16 > s->s3->rrec.length) | ||
| 1462 | return 0; /* silently discard */ | ||
| 1463 | hbtype = *p++; | ||
| 1464 | n2s(p, payload); | ||
| 1465 | if (1 + 2 + payload + 16 > s->s3->rrec.length) | ||
| 1466 | return 0; /* silently discard per RFC 6520 sec. 4 */ | ||
| 1467 | pl = p; | ||
| 1468 | |||
| 1465 | if (hbtype == TLS1_HB_REQUEST) | 1469 | if (hbtype == TLS1_HB_REQUEST) |
| 1466 | { | 1470 | { |
| 1467 | unsigned char *buffer, *bp; | 1471 | unsigned char *buffer, *bp; |
| 1472 | unsigned int write_length = 1 /* heartbeat type */ + | ||
| 1473 | 2 /* heartbeat length */ + | ||
| 1474 | payload + padding; | ||
| 1468 | int r; | 1475 | int r; |
| 1469 | 1476 | ||
| 1477 | if (write_length > SSL3_RT_MAX_PLAIN_LENGTH) | ||
| 1478 | return 0; | ||
| 1479 | |||
| 1470 | /* Allocate memory for the response, size is 1 byte | 1480 | /* Allocate memory for the response, size is 1 byte |
| 1471 | * message type, plus 2 bytes payload length, plus | 1481 | * message type, plus 2 bytes payload length, plus |
| 1472 | * payload, plus padding | 1482 | * payload, plus padding |
| 1473 | */ | 1483 | */ |
| 1474 | buffer = OPENSSL_malloc(1 + 2 + payload + padding); | 1484 | buffer = OPENSSL_malloc(write_length); |
| 1475 | bp = buffer; | 1485 | bp = buffer; |
| 1476 | 1486 | ||
| 1477 | /* Enter response type, length and copy payload */ | 1487 | /* Enter response type, length and copy payload */ |
| @@ -1482,11 +1492,11 @@ dtls1_process_heartbeat(SSL *s) | |||
| 1482 | /* Random padding */ | 1492 | /* Random padding */ |
| 1483 | RAND_pseudo_bytes(bp, padding); | 1493 | RAND_pseudo_bytes(bp, padding); |
| 1484 | 1494 | ||
| 1485 | r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding); | 1495 | r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, write_length); |
| 1486 | 1496 | ||
| 1487 | if (r >= 0 && s->msg_callback) | 1497 | if (r >= 0 && s->msg_callback) |
| 1488 | s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT, | 1498 | s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT, |
| 1489 | buffer, 3 + payload + padding, | 1499 | buffer, write_length, |
| 1490 | s, s->msg_callback_arg); | 1500 | s, s->msg_callback_arg); |
| 1491 | 1501 | ||
| 1492 | OPENSSL_free(buffer); | 1502 | OPENSSL_free(buffer); |
diff --git a/src/lib/libssl/src/ssl/t1_lib.c b/src/lib/libssl/src/ssl/t1_lib.c index bfd4731365..a649dafba9 100644 --- a/src/lib/libssl/src/ssl/t1_lib.c +++ b/src/lib/libssl/src/ssl/t1_lib.c | |||
| @@ -2441,16 +2441,20 @@ tls1_process_heartbeat(SSL *s) | |||
| 2441 | unsigned int payload; | 2441 | unsigned int payload; |
| 2442 | unsigned int padding = 16; /* Use minimum padding */ | 2442 | unsigned int padding = 16; /* Use minimum padding */ |
| 2443 | 2443 | ||
| 2444 | /* Read type and payload length first */ | ||
| 2445 | hbtype = *p++; | ||
| 2446 | n2s(p, payload); | ||
| 2447 | pl = p; | ||
| 2448 | |||
| 2449 | if (s->msg_callback) | 2444 | if (s->msg_callback) |
| 2450 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, | 2445 | s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, |
| 2451 | &s->s3->rrec.data[0], s->s3->rrec.length, | 2446 | &s->s3->rrec.data[0], s->s3->rrec.length, |
| 2452 | s, s->msg_callback_arg); | 2447 | s, s->msg_callback_arg); |
| 2453 | 2448 | ||
| 2449 | /* Read type and payload length first */ | ||
| 2450 | if (1 + 2 + 16 > s->s3->rrec.length) | ||
| 2451 | return 0; /* silently discard */ | ||
| 2452 | hbtype = *p++; | ||
| 2453 | n2s(p, payload); | ||
| 2454 | if (1 + 2 + payload + 16 > s->s3->rrec.length) | ||
| 2455 | return 0; /* silently discard per RFC 6520 sec. 4 */ | ||
| 2456 | pl = p; | ||
| 2457 | |||
| 2454 | if (hbtype == TLS1_HB_REQUEST) | 2458 | if (hbtype == TLS1_HB_REQUEST) |
| 2455 | { | 2459 | { |
| 2456 | unsigned char *buffer, *bp; | 2460 | unsigned char *buffer, *bp; |
