Always process handshake records in full. This removes the last place where non-app-data hooks leave anything uncomsumed in rrec. (There is still a place where non-app-data hooks see a non-empty rrec an entrance. read_app_data calls into read_handshake. That'll be fixed in a later patch in this series.) This should not change behavior, though some error codes may change due to some processing happening in a slightly different order. Since we do this in a few places, this adds a BUF_MEM_append with tests. Change-Id: I9fe1fc0103e47f90e3c9f4acfe638927aecdeff6 Reviewed-on: https://boringssl-review.googlesource.com/21345 Commit-Queue: Steven Valdez <svaldez@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org> Reviewed-by: Steven Valdez <svaldez@google.com>
diff --git a/ssl/internal.h b/ssl/internal.h index 4c1f9ea..f141923 100644 --- a/ssl/internal.h +++ b/ssl/internal.h
@@ -1000,9 +1000,13 @@ // dtls_clear_incoming_messages releases all buffered incoming messages. void dtls_clear_incoming_messages(SSL *ssl); -// dtls_has_incoming_messages returns one if there are buffered incoming -// messages ahead of the current message and zero otherwise. -int dtls_has_incoming_messages(const SSL *ssl); +// tls_has_unprocessed_handshake_data returns whether there is buffered +// handshake data that has not been consumed by |get_message|. +bool tls_has_unprocessed_handshake_data(const SSL *ssl); + +// dtls_has_unprocessed_handshake_data behaves like +// |tls_has_unprocessed_handshake_data| for DTLS. +bool dtls_has_unprocessed_handshake_data(const SSL *ssl); struct DTLS_OUTGOING_MESSAGE { uint8_t *data; @@ -2687,7 +2691,10 @@ int peek); int ssl3_read_change_cipher_spec(SSL *ssl); void ssl3_read_close_notify(SSL *ssl); -int ssl3_read_handshake_bytes(SSL *ssl, uint8_t *buf, int len); +// ssl3_get_record reads a new input record. On success, it places it in +// |ssl->s3->rrec| and returns one. Otherwise it returns <= 0 on error or if +// more data is needed. +int ssl3_get_record(SSL *ssl); int ssl3_write_app_data(SSL *ssl, bool *out_needs_handshake, const uint8_t *buf, int len);