diff options
author | lloyd <[email protected]> | 2012-09-11 15:05:49 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2012-09-11 15:05:49 +0000 |
commit | 7604a4db0b6540b41223d072d91e2ff9e0bdb035 (patch) | |
tree | a0168f2aca396555954339e17456cb969ef130e1 /src/tls/tls_record.cpp | |
parent | 841cc39716104b3438757188d1328a68c1464f81 (diff) |
Set m_readbuf_pos == m_readbuf.size(), resizing the vector as needed
rather than preallocating the maximum possible size.
Diffstat (limited to 'src/tls/tls_record.cpp')
-rw-r--r-- | src/tls/tls_record.cpp | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/src/tls/tls_record.cpp b/src/tls/tls_record.cpp index b2c32e5f9..23b44e67e 100644 --- a/src/tls/tls_record.cpp +++ b/src/tls/tls_record.cpp @@ -129,7 +129,7 @@ void write_record(std::vector<byte>& output, iv_size + msg_length + mac_size + (block_size ? 1 : 0), block_size); - if(buf_size >= MAX_CIPHERTEXT_SIZE) + if(buf_size > MAX_CIPHERTEXT_SIZE) throw Internal_Error("Output record is larger than allowed by protocol"); output.push_back(get_byte<u16bit>(0, buf_size)); @@ -194,29 +194,22 @@ void write_record(std::vector<byte>& output, namespace { size_t fill_buffer_to(std::vector<byte>& readbuf, - size_t& readbuf_pos, const byte*& input, size_t& input_size, size_t& input_consumed, size_t desired) { - if(desired <= readbuf_pos) + if(readbuf.size() >= desired) return 0; // already have it - const size_t space_available = (readbuf.size() - readbuf_pos); - const size_t taken = std::min(input_size, desired - readbuf_pos); - - if(taken > space_available) - throw TLS_Exception(Alert::RECORD_OVERFLOW, - "Record is larger than allowed maximum size"); + const size_t taken = std::min(input_size, desired - readbuf.size()); - copy_mem(&readbuf[readbuf_pos], input, taken); - readbuf_pos += taken; + readbuf.insert(readbuf.end(), &input[0], &input[taken]); input_consumed += taken; input_size -= taken; input += taken; - return (desired - readbuf_pos); // how many bytes do we still need? + return (desired - readbuf.size()); // how many bytes do we still need? } /* @@ -270,7 +263,6 @@ size_t tls_padding_check(bool sslv3_padding, } size_t read_record(std::vector<byte>& readbuf, - size_t& readbuf_pos, const byte input[], size_t input_sz, size_t& consumed, @@ -283,14 +275,14 @@ size_t read_record(std::vector<byte>& readbuf, { consumed = 0; - if(readbuf_pos < TLS_HEADER_SIZE) // header incomplete? + if(readbuf.size() < TLS_HEADER_SIZE) // header incomplete? { - if(size_t needed = fill_buffer_to(readbuf, readbuf_pos, + if(size_t needed = fill_buffer_to(readbuf, input, input_sz, consumed, TLS_HEADER_SIZE)) return needed; - BOTAN_ASSERT_EQUAL(readbuf_pos, TLS_HEADER_SIZE, + BOTAN_ASSERT_EQUAL(readbuf.size(), TLS_HEADER_SIZE, "Have an entire header"); } @@ -305,12 +297,12 @@ size_t read_record(std::vector<byte>& readbuf, { const size_t record_len = make_u16bit(readbuf[0], readbuf[1]) & 0x7FFF; - if(size_t needed = fill_buffer_to(readbuf, readbuf_pos, + if(size_t needed = fill_buffer_to(readbuf, input, input_sz, consumed, record_len + 2)) return needed; - BOTAN_ASSERT_EQUAL(readbuf_pos, (record_len + 2), + BOTAN_ASSERT_EQUAL(readbuf.size(), (record_len + 2), "Have the entire SSLv2 hello"); msg_type = HANDSHAKE; @@ -323,22 +315,23 @@ size_t read_record(std::vector<byte>& readbuf, msg[2] = readbuf[0] & 0x7F; msg[3] = readbuf[1]; - copy_mem(&msg[4], &readbuf[2], readbuf_pos - 2); - readbuf_pos = 0; + copy_mem(&msg[4], &readbuf[2], readbuf.size() - 2); + + readbuf.clear(); return 0; } } record_version = Protocol_Version(readbuf[1], readbuf[2]); - if(record_version.is_datagram_protocol() && readbuf_pos < DTLS_HEADER_SIZE) + if(record_version.is_datagram_protocol() && readbuf.size() < DTLS_HEADER_SIZE) { - if(size_t needed = fill_buffer_to(readbuf, readbuf_pos, + if(size_t needed = fill_buffer_to(readbuf, input, input_sz, consumed, DTLS_HEADER_SIZE)) return needed; - BOTAN_ASSERT_EQUAL(readbuf_pos, DTLS_HEADER_SIZE, + BOTAN_ASSERT_EQUAL(readbuf.size(), DTLS_HEADER_SIZE, "Have an entire header"); } @@ -359,13 +352,13 @@ size_t read_record(std::vector<byte>& readbuf, throw TLS_Exception(Alert::RECORD_OVERFLOW, "Got message that exceeds maximum size"); - if(size_t needed = fill_buffer_to(readbuf, readbuf_pos, + if(size_t needed = fill_buffer_to(readbuf, input, input_sz, consumed, header_size + record_len)) return needed; BOTAN_ASSERT_EQUAL(static_cast<size_t>(header_size) + record_len, - readbuf_pos, + readbuf.size(), "Have the full record"); if(sequence_numbers && sequence_numbers->already_seen(record_sequence)) @@ -378,7 +371,7 @@ size_t read_record(std::vector<byte>& readbuf, msg_type = readbuf[0]; msg.assign(&record_contents[0], &record_contents[record_len]); - readbuf_pos = 0; + readbuf.clear(); return 0; // got a full record } @@ -469,7 +462,7 @@ size_t read_record(std::vector<byte>& readbuf, msg.assign(&record_contents[iv_size], &record_contents[iv_size + plain_length]); - readbuf_pos = 0; + readbuf.clear(); return 0; } |