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