@@ -74,6 +74,12 @@ bool ClientHelloParser::ParseRecordHeader(const uint8_t* data, size_t avail) {
74
74
75
75
void ClientHelloParser::ParseHeader (const uint8_t * data, size_t avail) {
76
76
ClientHello hello;
77
+ bool failed = true ;
78
+
79
+ OnScopeLeave cleanup ([&]() {
80
+ if (failed)
81
+ End ();
82
+ });
77
83
78
84
// >= 5 + frame size bytes for frame parsing
79
85
if (body_offset_ + frame_len_ > avail)
@@ -88,23 +94,23 @@ void ClientHelloParser::ParseHeader(const uint8_t* data, size_t avail) {
88
94
if (data[body_offset_ + 4 ] != 0x03 ||
89
95
data[body_offset_ + 5 ] < 0x01 ||
90
96
data[body_offset_ + 5 ] > 0x03 ) {
91
- goto fail ;
97
+ return ;
92
98
}
93
99
94
100
if (data[body_offset_] == kClientHello ) {
95
101
if (state_ == kTLSHeader ) {
96
102
if (!ParseTLSClientHello (data, avail))
97
- goto fail ;
103
+ return ;
98
104
} else {
99
105
// We couldn't get here, but whatever
100
- goto fail ;
106
+ return ;
101
107
}
102
108
103
109
// Check if we overflowed (do not reply with any private data)
104
110
if (session_id_ == nullptr ||
105
111
session_size_ > 32 ||
106
112
session_id_ + session_size_ > data + avail) {
107
- goto fail ;
113
+ return ;
108
114
}
109
115
}
110
116
@@ -116,10 +122,8 @@ void ClientHelloParser::ParseHeader(const uint8_t* data, size_t avail) {
116
122
hello.servername_ = servername_;
117
123
hello.servername_size_ = static_cast <uint8_t >(servername_size_);
118
124
onhello_cb_ (cb_arg_, hello);
125
+ failed = false ;
119
126
return ;
120
-
121
- fail:
122
- End ();
123
127
}
124
128
125
129
0 commit comments