Fix a bug in bssl::OpenRecord.
Checking the record type returned by the |tls_open_record| call only
makes sense if that call was successful.
Change-Id: Ib4bebd2b1198c7def513d9fba3653524c17a6e68
Reviewed-on: https://boringssl-review.googlesource.com/18884
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/tls_record.cc b/ssl/tls_record.cc
index 745ddb8..f8bb521 100644
--- a/ssl/tls_record.cc
+++ b/ssl/tls_record.cc
@@ -596,44 +596,33 @@
return OpenRecordResult::kError;
}
- *out = Span<uint8_t>();
- *out_record_len = 0;
-
CBS plaintext;
uint8_t type;
- size_t record_len;
const ssl_open_record_t result = tls_open_record(
- ssl, &type, &plaintext, &record_len, out_alert, in.data(), in.size());
- if (type != SSL3_RT_APPLICATION_DATA && type != SSL3_RT_ALERT) {
- *out_alert = SSL_AD_UNEXPECTED_MESSAGE;
- return OpenRecordResult::kError;
- }
+ ssl, &type, &plaintext, out_record_len, out_alert, in.data(), in.size());
- OpenRecordResult ret = OpenRecordResult::kError;
switch (result) {
case ssl_open_record_success:
- ret = OpenRecordResult::kOK;
- break;
+ if (type != SSL3_RT_APPLICATION_DATA && type != SSL3_RT_ALERT) {
+ *out_alert = SSL_AD_UNEXPECTED_MESSAGE;
+ return OpenRecordResult::kError;
+ }
+ *out = MakeSpan(
+ const_cast<uint8_t*>(CBS_data(&plaintext)), CBS_len(&plaintext));
+ return OpenRecordResult::kOK;
case ssl_open_record_discard:
- ret = OpenRecordResult::kDiscard;
- break;
+ return OpenRecordResult::kDiscard;
case ssl_open_record_partial:
- ret = OpenRecordResult::kIncompleteRecord;
- break;
+ return OpenRecordResult::kIncompleteRecord;
case ssl_open_record_close_notify:
- ret = OpenRecordResult::kAlertCloseNotify;
- break;
+ return OpenRecordResult::kAlertCloseNotify;
case ssl_open_record_fatal_alert:
- ret = OpenRecordResult::kAlertFatal;
- break;
+ return OpenRecordResult::kAlertFatal;
case ssl_open_record_error:
- ret = OpenRecordResult::kError;
- break;
+ return OpenRecordResult::kError;
}
- *out =
- MakeSpan(const_cast<uint8_t*>(CBS_data(&plaintext)), CBS_len(&plaintext));
- *out_record_len = record_len;
- return ret;
+ assert(false);
+ return OpenRecordResult::kError;
}
size_t SealRecordPrefixLen(const SSL *ssl, const size_t record_len) {