in source/event_stream.c [1211:1273]
static int s_verify_prelude_state(
struct aws_event_stream_streaming_decoder *decoder,
const uint8_t *data,
size_t len,
size_t *processed) /* NOLINT */ {
(void)data;
(void)len;
(void)processed;
decoder->prelude.headers_len = aws_read_u32(decoder->working_buffer + HEADER_LEN_OFFSET);
decoder->prelude.prelude_crc = aws_read_u32(decoder->working_buffer + PRELUDE_CRC_OFFSET);
decoder->prelude.total_len = aws_read_u32(decoder->working_buffer + TOTAL_LEN_OFFSET);
decoder->running_crc = aws_checksums_crc32(decoder->working_buffer, PRELUDE_CRC_OFFSET, 0);
if (AWS_LIKELY(decoder->running_crc == decoder->prelude.prelude_crc)) {
if (AWS_UNLIKELY(
decoder->prelude.headers_len > AWS_EVENT_STREAM_MAX_HEADERS_SIZE ||
decoder->prelude.total_len > AWS_EVENT_STREAM_MAX_MESSAGE_SIZE)) {
aws_raise_error(AWS_ERROR_EVENT_STREAM_MESSAGE_FIELD_SIZE_EXCEEDED);
char error_message[] = "Maximum message field size exceeded";
decoder->on_error(
decoder,
&decoder->prelude,
AWS_ERROR_EVENT_STREAM_MESSAGE_FIELD_SIZE_EXCEEDED,
error_message,
decoder->user_context);
return AWS_OP_ERR;
}
/* Should only call on_prelude() after passing crc check and limitation check, otherwise call on_prelude() with
* incorrect prelude is error prune. */
decoder->on_prelude(decoder, &decoder->prelude, decoder->user_context);
decoder->running_crc = aws_checksums_crc32(
decoder->working_buffer + PRELUDE_CRC_OFFSET,
(int)sizeof(decoder->prelude.prelude_crc),
decoder->running_crc);
memset(decoder->working_buffer, 0, sizeof(decoder->working_buffer));
decoder->state = decoder->prelude.headers_len > 0 ? s_headers_state : s_payload_state;
} else {
char error_message[70];
snprintf(
error_message,
sizeof(error_message),
"CRC Mismatch. prelude_crc was 0x08%" PRIX32 ", but computed 0x08%" PRIX32,
decoder->prelude.prelude_crc,
decoder->running_crc);
aws_raise_error(AWS_ERROR_EVENT_STREAM_PRELUDE_CHECKSUM_FAILURE);
decoder->on_error(
decoder,
&decoder->prelude,
AWS_ERROR_EVENT_STREAM_PRELUDE_CHECKSUM_FAILURE,
error_message,
decoder->user_context);
return AWS_OP_ERR;
}
return AWS_OP_SUCCESS;
}