Bug#33814 - yassl problems

(recommit)
parent 24e61819
...@@ -527,6 +527,11 @@ void ProcessOldClientHello(input_buffer& input, SSL& ssl) ...@@ -527,6 +527,11 @@ void ProcessOldClientHello(input_buffer& input, SSL& ssl)
input.read(len, sizeof(len)); input.read(len, sizeof(len));
uint16 randomLen; uint16 randomLen;
ato16(len, randomLen); ato16(len, randomLen);
if (ch.suite_len_ > MAX_SUITE_SZ || sessionLen > ID_LEN ||
randomLen > RAN_LEN) {
ssl.SetError(bad_input);
return;
}
int j = 0; int j = 0;
for (uint16 i = 0; i < ch.suite_len_; i += 3) { for (uint16 i = 0; i < ch.suite_len_; i += 3) {
......
...@@ -101,6 +101,7 @@ template void ysArrayDelete<unsigned char>(unsigned char*); ...@@ -101,6 +101,7 @@ template void ysArrayDelete<unsigned char>(unsigned char*);
template void ysArrayDelete<char>(char*); template void ysArrayDelete<char>(char*);
template int min<int>(int, int); template int min<int>(int, int);
template uint16 min<uint16>(uint16, uint16);
template unsigned int min<unsigned int>(unsigned int, unsigned int); template unsigned int min<unsigned int>(unsigned int, unsigned int);
template unsigned long min<unsigned long>(unsigned long, unsigned long); template unsigned long min<unsigned long>(unsigned long, unsigned long);
} }
......
...@@ -621,6 +621,10 @@ void HandShakeHeader::Process(input_buffer& input, SSL& ssl) ...@@ -621,6 +621,10 @@ void HandShakeHeader::Process(input_buffer& input, SSL& ssl)
} }
uint len = c24to32(length_); uint len = c24to32(length_);
if (len > input.get_remaining()) {
ssl.SetError(bad_input);
return;
}
hashHandShake(ssl, input, len); hashHandShake(ssl, input, len);
hs->set_length(len); hs->set_length(len);
...@@ -1391,10 +1395,15 @@ input_buffer& operator>>(input_buffer& input, ClientHello& hello) ...@@ -1391,10 +1395,15 @@ input_buffer& operator>>(input_buffer& input, ClientHello& hello)
// Suites // Suites
byte tmp[2]; byte tmp[2];
uint16 len;
tmp[0] = input[AUTO]; tmp[0] = input[AUTO];
tmp[1] = input[AUTO]; tmp[1] = input[AUTO];
ato16(tmp, hello.suite_len_); ato16(tmp, len);
hello.suite_len_ = min(len, static_cast<uint16>(MAX_SUITE_SZ));
input.read(hello.cipher_suites_, hello.suite_len_); input.read(hello.cipher_suites_, hello.suite_len_);
if (len > hello.suite_len_) // ignore extra suites
input.set_current(input.get_current() + len - hello.suite_len_);
// Compression // Compression
hello.comp_len_ = input[AUTO]; hello.comp_len_ = input[AUTO];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment