From 6f35e91ffd5311919df1e2b82d149c7cc24937b9 Mon Sep 17 00:00:00 2001 From: Martin Nilsson <nilsson@opera.com> Date: Mon, 5 May 2014 00:13:10 +0200 Subject: [PATCH] Fail predicably with a fatal decoding_error on any low level syntax errors. --- lib/modules/SSL.pmod/Connection.pike | 36 ++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/modules/SSL.pmod/Connection.pike b/lib/modules/SSL.pmod/Connection.pike index f8841db2b2..add67d1a7d 100644 --- a/lib/modules/SSL.pmod/Connection.pike +++ b/lib/modules/SSL.pmod/Connection.pike @@ -1021,9 +1021,22 @@ string|int got_data(string|int s) sscanf(handshake_buffer, "%*c%3c", len); if (sizeof(handshake_buffer) < (len + 4)) break; - err = handle_handshake(handshake_buffer[0], - handshake_buffer[4..len + 3], - handshake_buffer[.. len + 3]); + mixed exception = catch { + err = handle_handshake(handshake_buffer[0], + handshake_buffer[4..len + 3], + handshake_buffer[.. len + 3]); + }; + if( exception ) + { + if( objectp(exception) && ([object]exception)->ADT_struct ) + { + Error.Generic e = [object(Error.Generic)]exception; + send_packet(Alert(ALERT_fatal, ALERT_decode_error, + e->message())); + return -1; + } + throw(exception); + } handshake_buffer = handshake_buffer[len + 4..]; if (err < 0) return err; @@ -1064,7 +1077,22 @@ string|int got_data(string|int s) "Heart beat mode not enabled.\n")); break; } - handle_heartbeat(packet->fragment); + + mixed exception = catch { + handle_heartbeat(packet->fragment); + }; + if( exception ) + { + if( objectp(exception) && ([object]exception)->ADT_struct ) + { + Error.Generic e = [object(Error.Generic)]exception; + send_packet(Alert(ALERT_fatal, ALERT_decode_error, + e->message())); + return -1; + } + throw(exception); + } + } break; default: -- GitLab