Maximum transactions
~~~~~~~~~~~~~~~~~~~~
-MQTT, FTP, PostgreSQL, SMB, DCERPC, HTTP1 and NFS have each a `max-tx` parameter that can be customized.
+SMTP, MQTT, FTP, PostgreSQL, SMB, DCERPC, HTTP1 and NFS have each a `max-tx` parameter that can be customized.
`max-tx` refers to the maximum number of live transactions for each flow.
An app-layer event `protocol.too_many_transactions` is triggered when this value is reached.
The point of this parameter is to find a balance between the completeness of analysis
#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;
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;
}
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;
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;
// 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;
* 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;
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;
}