Skip to content

Commit 323fd75

Browse files
committed
dtls.c: Fix handling ClientHello if no peer and fragment
If a fragmented ClientHello is received with no peer, do not handle it. Also fixed situation where there was insuffient decrypted data provieded to save away a single fragment. Signed-off-by: Jon Shallow <supjps-libcoap@jpshallow.com>
1 parent 94205ff commit 323fd75

1 file changed

Lines changed: 14 additions & 2 deletions

File tree

dtls.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3676,6 +3676,11 @@ handle_handshake(dtls_context_t *ctx, dtls_peer_t *peer, session_t *session,
36763676
size_t fragment_offset = dtls_uint24_to_int(hs_header->fragment_offset);
36773677

36783678
if (packet_length > fragment_length){
3679+
if (!peer || !peer->handshake_params) {
3680+
/* This is the initial ClientHello */
3681+
dtls_alert("Cannot handle fragmented ClientHello\n");
3682+
return dtls_alert_fatal_create(DTLS_ALERT_HANDSHAKE_FAILURE);
3683+
}
36793684
dtls_debug("received fragmented handshake packet: length %zu, fragment length %zu.\n",
36803685
packet_length, fragment_length);
36813686
/* If (reassembled) packet is larger than our buffer, drop with error */
@@ -3711,8 +3716,15 @@ handle_handshake(dtls_context_t *ctx, dtls_peer_t *peer, session_t *session,
37113716
return dtls_alert_fatal_create(DTLS_ALERT_HANDSHAKE_FAILURE); // TODO: Is this the correct alert?
37123717
}
37133718
/* Looks good: copy fragment in buffer */
3714-
dtls_debug("copying fragment to buffer: offset (%zu), length (%zu).\n", fragment_offset,
3715-
fragment_length);
3719+
dtls_debug("copying fragment to buffer: offset (%zu), length (%zu),"
3720+
" data_length (%zu).\n", fragment_offset, fragment_length,
3721+
data_length - (fragment_offset == 0 ?
3722+
sizeof(dtls_handshake_header_t) : 0));
3723+
if ((size_t)fragment_length + (fragment_offset == 0 ?
3724+
sizeof(dtls_handshake_header_t) : 0) > data_length) {
3725+
dtls_warn("insufficient data for fragment\n");
3726+
return dtls_alert_fatal_create(DTLS_ALERT_RECORD_OVERFLOW); // TODO: Is this the correct alert?
3727+
}
37163728
memcpy(peer->handshake_params->reassemble_buf->data + fragment_offset + (fragment_offset != 0 ? sizeof(dtls_handshake_header_t) : 0),
37173729
data, (size_t)fragment_length + (fragment_offset == 0 ? sizeof(dtls_handshake_header_t) : 0));
37183730
peer->handshake_params->reassemble_buf->last_offset = fragment_offset + fragment_length;

0 commit comments

Comments
 (0)