return 0;
}
+/** \internal
+ * \brief setup or grow the `trec` space in the connp
+ */
+static int EnsureRecordSpace(SSLStateConnp *curr_connp, const uint32_t input_len)
+{
+ if (curr_connp->trec == NULL) {
+ curr_connp->trec_len = 2 * curr_connp->record_length + SSLV3_RECORD_HDR_LEN + 1;
+ curr_connp->trec = SCMalloc(curr_connp->trec_len);
+ if (unlikely(curr_connp->trec == NULL))
+ goto error;
+ }
+
+ if (curr_connp->trec_pos + input_len >= curr_connp->trec_len) {
+ curr_connp->trec_len = curr_connp->trec_pos + 2 * input_len + 1;
+ void *ptmp = SCRealloc(curr_connp->trec, curr_connp->trec_len);
+ if (unlikely(ptmp == NULL)) {
+ SCFree(curr_connp->trec);
+ curr_connp->trec = NULL;
+ goto error;
+ }
+ curr_connp->trec = ptmp;
+ }
+
+ return 0;
+error:
+ curr_connp->trec_len = 0;
+ curr_connp->trec_pos = 0;
+ return -1;
+}
+
static int SSLv3ParseHandshakeType(SSLState *ssl_state, const uint8_t *input,
uint32_t input_len, uint8_t direction)
{
- void *ptmp;
const uint8_t *initial_input = input;
uint32_t parsed = 0;
int rc;
"direction!");
break;
}
- if (ssl_state->curr_connp->trec == NULL) {
- ssl_state->curr_connp->trec_len =
- 2 * ssl_state->curr_connp->record_length +
- SSLV3_RECORD_HDR_LEN + 1;
- ssl_state->curr_connp->trec =
- SCMalloc(ssl_state->curr_connp->trec_len);
- }
- if (ssl_state->curr_connp->trec_pos + input_len >=
- ssl_state->curr_connp->trec_len) {
- ssl_state->curr_connp->trec_len =
- ssl_state->curr_connp->trec_pos + 2 * input_len + 1;
- ptmp = SCRealloc(ssl_state->curr_connp->trec,
- ssl_state->curr_connp->trec_len);
-
- if (unlikely(ptmp == NULL)) {
- SCFree(ssl_state->curr_connp->trec);
- }
- ssl_state->curr_connp->trec = ptmp;
- }
- if (unlikely(ssl_state->curr_connp->trec == NULL)) {
- ssl_state->curr_connp->trec_len = 0;
+ if (EnsureRecordSpace(ssl_state->curr_connp, input_len) < 0) {
/* error, skip packet */
parsed += input_len;
(void)parsed; /* for scan-build */