/**
* \brief make sure that the buffer has at least 'min_size' bytes
* Expand the buffer if necessary
+ *
+ * \retval pointer to inner buffer to use, or NULL if realloc failed
*/
-void InspectionBufferCheckAndExpand(InspectionBuffer *buffer, uint32_t min_size)
+uint8_t *InspectionBufferCheckAndExpand(InspectionBuffer *buffer, uint32_t min_size)
{
if (likely(buffer->size >= min_size))
- return;
+ return buffer->buf;
uint32_t new_size = (buffer->size == 0) ? 4096 : buffer->size;
while (new_size < min_size) {
if (ptr != NULL) {
buffer->buf = ptr;
buffer->size = new_size;
+ } else {
+ return NULL;
}
+ return buffer->buf;
+}
+
+/**
+ * \brief set inspect length of inspect buffer
+ * The inspect buffer may have been overallocated (by strip_whitespace for example)
+ * so, this sets the final length
+ */
+void InspectionBufferTruncate(InspectionBuffer *buffer, uint32_t buf_len)
+{
+ DEBUG_VALIDATE_BUG_ON(buffer->buf == NULL);
+ DEBUG_VALIDATE_BUG_ON(buf_len > buffer->size);
+ buffer->inspect = buffer->buf;
+ buffer->inspect_len = buf_len;
+ buffer->initialized = true;
}
void InspectionBufferCopy(InspectionBuffer *buffer, uint8_t *buf, uint32_t buf_len)
void InspectionBufferSetup(DetectEngineThreadCtx *det_ctx, const int list_id,
InspectionBuffer *buffer, const uint8_t *data, const uint32_t data_len);
void InspectionBufferFree(InspectionBuffer *buffer);
-void InspectionBufferCheckAndExpand(InspectionBuffer *buffer, uint32_t min_size);
+uint8_t *InspectionBufferCheckAndExpand(InspectionBuffer *buffer, uint32_t min_size);
+void InspectionBufferTruncate(InspectionBuffer *buffer, uint32_t buf_len);
void InspectionBufferCopy(InspectionBuffer *buffer, uint8_t *buf, uint32_t buf_len);
void InspectionBufferApplyTransforms(InspectionBuffer *buffer,
const DetectEngineTransforms *transforms);
return;
}
- uint8_t output[input_len];
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
for (uint32_t i = 0; i < input_len; i++) {
output[i] = u8_tolower(input[i]);
}
- InspectionBufferCopy(buffer, output, input_len);
+ InspectionBufferTruncate(buffer, input_len);
}
/**
* \internal
return;
}
- uint8_t output[input_len];
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
for (uint32_t i = 0; i < input_len; i++) {
output[i] = u8_toupper(input[i]);
}
- InspectionBufferCopy(buffer, output, input_len);
+ InspectionBufferTruncate(buffer, input_len);
}
/*
return;
}
- uint8_t output[input_len]; // we can only shrink
+ // we can only shrink
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
uint8_t *oi = output, *os = output;
//PrintRawDataFp(stdout, input, input_len);
uint32_t output_size = oi - os;
//PrintRawDataFp(stdout, output, output_size);
- InspectionBufferCopy(buffer, os, output_size);
+ InspectionBufferTruncate(buffer, output_size);
}
#ifdef UNITTESTS
const size_t input_len = buffer->inspect_len;
if (input_len) {
- uint8_t output[input_len + 1]; // For the leading '.'
+ // For the leading '.'
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len + 1);
+ if (output == NULL) {
+ return;
+ }
output[0] = '.';
memcpy(&output[1], buffer->inspect, input_len);
- InspectionBufferCopy(buffer, output, input_len + 1);
+ InspectionBufferTruncate(buffer, input_len + 1);
}
}
if (input_len == 0) {
return;
}
- uint8_t output[input_len];
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
// state 0 is header name, 1 is header value
int state = 0;
}
}
}
- InspectionBufferCopy(buffer, output, input_len);
+ InspectionBufferTruncate(buffer, input_len);
}
void DetectTransformHeaderLowercaseRegister(void)
if (input_len == 0) {
return;
}
- uint8_t output[input_len];
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
bool new_line = true;
bool pseudo = false;
j++;
}
}
- InspectionBufferCopy(buffer, output, j);
+ InspectionBufferTruncate(buffer, j);
}
void DetectTransformStripPseudoHeadersRegister(void)
if (input_len == 0) {
return;
}
- uint8_t output[input_len]; // we can only shrink
+ // we can only shrink
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
uint8_t *oi = output, *os = output;
//PrintRawDataFp(stdout, input, input_len);
uint32_t output_size = oi - os;
//PrintRawDataFp(stdout, output, output_size);
- InspectionBufferCopy(buffer, os, output_size);
+ InspectionBufferTruncate(buffer, output_size);
}
#ifdef UNITTESTS
if (input_len == 0) {
return;
}
- uint8_t output[input_len]; // we can only shrink
+ // we can only shrink
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
changed = BufferUrlDecode(input, input_len, output, &output_size);
if (changed) {
- InspectionBufferCopy(buffer, output, output_size);
+ InspectionBufferTruncate(buffer, output_size);
}
}
if (input_len == 0) {
return;
}
- uint8_t output[input_len];
+ uint8_t *output = InspectionBufferCheckAndExpand(buffer, input_len);
+ if (output == NULL) {
+ return;
+ }
for (uint32_t i = 0; i < input_len; i++) {
output[i] = input[i] ^ pxd->key[i % pxd->length];
}
- InspectionBufferCopy(buffer, output, input_len);
+ InspectionBufferTruncate(buffer, input_len);
}
#ifdef UNITTESTS