// *** StreamSplitter => Inspector (facts about the most recent message section)
HttpEnums::SectionType section_type[2] = { HttpEnums::SEC__NOT_COMPUTE,
HttpEnums::SEC__NOT_COMPUTE };
+ int32_t octets_reassembled[2] = { HttpCommon::STAT_NOT_PRESENT, HttpCommon::STAT_NOT_PRESENT };
int32_t num_head_lines[2] = { HttpCommon::STAT_NOT_PRESENT, HttpCommon::STAT_NOT_PRESENT };
bool tcp_close[2] = { false, false };
bool partial_flush[2] = { false, false };
HttpFlowData* session_data = http_get_flow_data(p->flow);
- // FIXIT-H Workaround for unexpected eval() calls
- if (session_data->section_type[source_id] == SEC__NOT_COMPUTE)
+ // FIXIT-H Workaround for unexpected eval() calls. Convert to asserts when possible.
+ if ((session_data->section_type[source_id] == SEC__NOT_COMPUTE) ||
+ (session_data->type_expected[source_id] == SEC_ABORT) ||
+ (session_data->octets_reassembled[source_id] != p->dsize))
+ {
+ session_data->type_expected[source_id] = SEC_ABORT;
return;
+ }
+ session_data->octets_reassembled[source_id] = STAT_NOT_PRESENT;
// Don't make pkt_data for headers available to detection
if ((session_data->section_type[source_id] == SEC_HEADER) ||
{
HttpMsgSection* current_section;
HttpFlowData* session_data = http_get_flow_data(flow);
- assert(session_data != nullptr);
if (!session_data->partial_flush[source_id])
HttpModule::increment_peg_counts(PEG_INSPECT);
{
Profile profile(HttpModule::get_profile_stats());
- if (source_id != SRC_SERVER)
- {
- assert(false);
- return false;
- }
+ assert(source_id == SRC_SERVER);
HttpFlowData* session_data = HttpInspect::http_get_flow_data(flow);
assert(session_data != nullptr);
- if ((session_data->type_expected[source_id] != SEC_BODY_CL) &&
- (session_data->type_expected[source_id] != SEC_BODY_OLD) &&
- (session_data->type_expected[source_id] != SEC_BODY_CHUNK))
- {
- assert(false);
- return false;
- }
+ assert((session_data->type_expected[source_id] == SEC_BODY_CL) ||
+ (session_data->type_expected[source_id] == SEC_BODY_OLD) ||
+ (session_data->type_expected[source_id] == SEC_BODY_CHUNK));
#ifdef REG_TEST
if (HttpTestManager::use_test_output(HttpTestManager::IN_HTTP) &&
}
#endif
+ assert(session_data->type_expected[source_id] != SEC_ABORT);
+ if (session_data->section_type[source_id] == SEC__NOT_COMPUTE)
+ {
+ return { nullptr, 0 };
+ }
+
// Sometimes it is necessary to reassemble zero bytes when a connection is closing to trigger
// proper clean up. But even a zero-length buffer cannot be processed with a nullptr lest we
// get in trouble with memcpy() (undefined behavior) or some library.
if (data == nullptr)
data = (const uint8_t*)"";
- // FIXIT-H Workaround for TP Bug 149662
- if (session_data->section_type[source_id] == SEC__NOT_COMPUTE)
- {
- return { nullptr, 0 };
- }
-
- assert(session_data->section_type[source_id] != SEC__NOT_COMPUTE);
uint8_t*& partial_buffer = session_data->partial_buffer[source_id];
uint32_t& partial_buffer_length = session_data->partial_buffer_length[source_id];
uint32_t& partial_raw_bytes = session_data->partial_raw_bytes[source_id];
http_buf.data = buffer;
http_buf.length = buf_size;
+ session_data->octets_reassembled[source_id] = buf_size;
buffer = nullptr;
session_data->section_offset[source_id] = 0;