better htp memory handling & flow valgrind error fixed

remotes/origin/master-1.0.x
Gurvinder Singh 16 years ago committed by Victor Julien
parent 763fb4a583
commit bf236e4567

@ -183,29 +183,36 @@ static int HTPHandleRequestData(Flow *f, void *htp_state,
} }
r = htp_connp_req_data(hstate->connp, 0, input, input_len); r = htp_connp_req_data(hstate->connp, 0, input, input_len);
if (r == STREAM_STATE_ERROR || r == STREAM_STATE_DATA_OTHER)
{
if (r == STREAM_STATE_DATA_OTHER) {
SCLogDebug("CONNECT not supported yet");
} else {
switch(r) {
case STREAM_STATE_ERROR:
if (hstate->connp->last_error != NULL) { if (hstate->connp->last_error != NULL) {
SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP client request: " SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP client "
"[%"PRId32"] [%s] [%"PRId32"] %s", hstate->connp->last_error->level, "request: [%"PRId32"] [%s] [%"PRId32"] %s",
hstate->connp->last_error->file, hstate->connp->last_error->line, hstate->connp->last_error->level,
hstate->connp->last_error->file,
hstate->connp->last_error->line,
hstate->connp->last_error->msg); hstate->connp->last_error->msg);
} else { } else {
SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP client request"); SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP client "
} "request");
} }
hstate->flags |= HTP_FLAG_STATE_ERROR; hstate->flags |= HTP_FLAG_STATE_ERROR;
hstate->flags &= ~HTP_FLAG_STATE_DATA; hstate->flags &= ~HTP_FLAG_STATE_DATA;
hstate->flags &= ~HTP_NEW_BODY_SET; hstate->flags &= ~HTP_NEW_BODY_SET;
ret = -1; ret = -1;
break;
} else if (r == STREAM_STATE_DATA) { case STREAM_STATE_DATA:
hstate->flags |= HTP_FLAG_STATE_DATA; hstate->flags |= HTP_FLAG_STATE_DATA;
} else { break;
case STREAM_STATE_DATA_OTHER:
SCLogDebug("CONNECT not supported yet");
hstate->flags |= HTP_FLAG_STATE_ERROR;
hstate->flags &= ~HTP_FLAG_STATE_DATA;
hstate->flags &= ~HTP_NEW_BODY_SET;
ret = -1;
break;
default:
hstate->flags &= ~HTP_FLAG_STATE_DATA; hstate->flags &= ~HTP_FLAG_STATE_DATA;
hstate->flags &= ~HTP_NEW_BODY_SET; hstate->flags &= ~HTP_NEW_BODY_SET;
} }
@ -252,29 +259,35 @@ static int HTPHandleResponseData(Flow *f, void *htp_state,
hstate->flags &= ~HTP_NEW_BODY_SET; hstate->flags &= ~HTP_NEW_BODY_SET;
r = htp_connp_res_data(hstate->connp, 0, input, input_len); r = htp_connp_res_data(hstate->connp, 0, input, input_len);
if (r == STREAM_STATE_ERROR || r == STREAM_STATE_DATA_OTHER) switch(r) {
{ case STREAM_STATE_ERROR:
if (r == STREAM_STATE_DATA_OTHER) {
SCLogDebug("CONNECT not supported yet");
} else {
if (hstate->connp->last_error != NULL) { if (hstate->connp->last_error != NULL) {
SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP server response: " SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP server "
"[%"PRId32"] [%s] [%"PRId32"] %s", hstate->connp->last_error->level, "response: [%"PRId32"] [%s] [%"PRId32"] %s",
hstate->connp->last_error->file, hstate->connp->last_error->line, hstate->connp->last_error->level,
hstate->connp->last_error->file,
hstate->connp->last_error->line,
hstate->connp->last_error->msg); hstate->connp->last_error->msg);
} else { } else {
SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP server response"); SCLogError(SC_ERR_ALPARSER, "Error in parsing HTTP server "
} "response");
} }
hstate->flags = HTP_FLAG_STATE_ERROR; hstate->flags = HTP_FLAG_STATE_ERROR;
hstate->flags &= ~HTP_FLAG_STATE_DATA; hstate->flags &= ~HTP_FLAG_STATE_DATA;
hstate->flags &= ~HTP_NEW_BODY_SET; hstate->flags &= ~HTP_NEW_BODY_SET;
ret = -1; ret = -1;
break;
} else if (r == STREAM_STATE_DATA) { case STREAM_STATE_DATA:
hstate->flags |= HTP_FLAG_STATE_DATA; hstate->flags |= HTP_FLAG_STATE_DATA;
} else { break;
case STREAM_STATE_DATA_OTHER:
SCLogDebug("CONNECT not supported yet");
hstate->flags = HTP_FLAG_STATE_ERROR;
hstate->flags &= ~HTP_FLAG_STATE_DATA;
hstate->flags &= ~HTP_NEW_BODY_SET;
ret = -1;
break;
default:
hstate->flags &= ~HTP_FLAG_STATE_DATA; hstate->flags &= ~HTP_FLAG_STATE_DATA;
hstate->flags &= ~HTP_NEW_BODY_SET; hstate->flags &= ~HTP_NEW_BODY_SET;
} }
@ -500,6 +513,14 @@ static int HTPCallbackResponse(htp_connp_t *connp) {
} }
} }
/* Clear the trasactions which are processed by the engine from libhtp.
This helps in reducing the meory consumptions of libhtp */
while (list_size(hstate->connp->conn->transactions) > 0) {
htp_tx_t *tx = list_pop(hstate->connp->conn->transactions);
if (tx != NULL)
htp_tx_destroy(tx);
}
SCReturnInt(0); SCReturnInt(0);
} }

@ -628,7 +628,7 @@ void *FlowManagerThread(void *td)
uint32_t sleeping = 0; uint32_t sleeping = 0;
uint8_t emerg = FALSE; uint8_t emerg = FALSE;
memset(&tsdiff, 0, sizeof(tsdiff)); memset(&ts, 0, sizeof(ts));
SCLogDebug("%s started...", th_v->name); SCLogDebug("%s started...", th_v->name);
@ -702,6 +702,7 @@ void *FlowManagerThread(void *td)
} else { } else {
/* If we are reading a pcap, how long the pcap timestamps /* If we are reading a pcap, how long the pcap timestamps
* says that has passed */ * says that has passed */
memset(&tsdiff, 0, sizeof(tsdiff));
TimeGet(&tsdiff); TimeGet(&tsdiff);
if (tsdiff.tv_sec == ts.tv_sec && if (tsdiff.tv_sec == ts.tv_sec &&

Loading…
Cancel
Save