|
|
|
@ -112,6 +112,8 @@
|
|
|
|
|
#define SMTP_EHLO_EXTENSION_STARTTLS
|
|
|
|
|
#define SMTP_EHLO_EXTENSION_8BITMIME
|
|
|
|
|
|
|
|
|
|
#define SMTP_DEFAULT_MAX_TX 256
|
|
|
|
|
|
|
|
|
|
typedef struct SMTPInput_ {
|
|
|
|
|
/* current input that is being parsed */
|
|
|
|
|
const uint8_t *buf;
|
|
|
|
@ -421,6 +423,18 @@ static void SMTPConfigure(void) {
|
|
|
|
|
smtp_config.raw_extraction = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint64_t value = SMTP_DEFAULT_MAX_TX;
|
|
|
|
|
smtp_config.max_tx = SMTP_DEFAULT_MAX_TX;
|
|
|
|
|
const char *str = NULL;
|
|
|
|
|
if (ConfGet("app-layer.protocols.smtp.max-tx", &str) == 1) {
|
|
|
|
|
if (ParseSizeStringU64(str, &value) < 0) {
|
|
|
|
|
SCLogWarning("max-tx value cannot be deduced: %s,"
|
|
|
|
|
" keeping default",
|
|
|
|
|
str);
|
|
|
|
|
}
|
|
|
|
|
smtp_config.max_tx = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SCReturn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -436,8 +450,11 @@ static void SMTPSetEvent(SMTPState *s, uint8_t e)
|
|
|
|
|
SCLogDebug("couldn't set event %u", e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static SMTPTransaction *SMTPTransactionCreate(void)
|
|
|
|
|
static SMTPTransaction *SMTPTransactionCreate(SMTPState *state)
|
|
|
|
|
{
|
|
|
|
|
if (state->tx_cnt > smtp_config.max_tx) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
SMTPTransaction *tx = SCCalloc(1, sizeof(*tx));
|
|
|
|
|
if (tx == NULL) {
|
|
|
|
|
return NULL;
|
|
|
|
@ -1170,7 +1187,7 @@ static int SMTPProcessRequest(SMTPState *state, Flow *f, AppLayerParserState *ps
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if (state->curr_tx == NULL || (state->curr_tx->done && !NoNewTx(state, line))) {
|
|
|
|
|
tx = SMTPTransactionCreate();
|
|
|
|
|
tx = SMTPTransactionCreate(state);
|
|
|
|
|
if (tx == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
state->curr_tx = tx;
|
|
|
|
@ -1203,7 +1220,7 @@ static int SMTPProcessRequest(SMTPState *state, Flow *f, AppLayerParserState *ps
|
|
|
|
|
// we did not close the previous tx, set error
|
|
|
|
|
SMTPSetEvent(state, SMTP_DECODER_EVENT_UNPARSABLE_CONTENT);
|
|
|
|
|
FileCloseFile(&tx->files_ts, &smtp_config.sbcfg, NULL, 0, FILE_TRUNCATED);
|
|
|
|
|
tx = SMTPTransactionCreate();
|
|
|
|
|
tx = SMTPTransactionCreate(state);
|
|
|
|
|
if (tx == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
state->curr_tx = tx;
|
|
|
|
@ -1221,7 +1238,7 @@ static int SMTPProcessRequest(SMTPState *state, Flow *f, AppLayerParserState *ps
|
|
|
|
|
* of first one. So we start a new transaction. */
|
|
|
|
|
tx->mime_state->state_flag = PARSE_ERROR;
|
|
|
|
|
SMTPSetEvent(state, SMTP_DECODER_EVENT_UNPARSABLE_CONTENT);
|
|
|
|
|
tx = SMTPTransactionCreate();
|
|
|
|
|
tx = SMTPTransactionCreate(state);
|
|
|
|
|
if (tx == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
state->curr_tx = tx;
|
|
|
|
@ -1932,6 +1949,8 @@ static void SMTPTestInitConfig(void)
|
|
|
|
|
smtp_config.content_inspect_window = FILEDATA_CONTENT_INSPECT_WINDOW;
|
|
|
|
|
smtp_config.content_inspect_min_size = FILEDATA_CONTENT_INSPECT_MIN_SIZE;
|
|
|
|
|
|
|
|
|
|
smtp_config.max_tx = SMTP_DEFAULT_MAX_TX;
|
|
|
|
|
|
|
|
|
|
smtp_config.sbcfg.buf_size = FILEDATA_CONTENT_INSPECT_WINDOW;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|