ftp: mark LF found per line

Currently, there is no way to mark if LF was found and then the line was
truncated. It becomes difficult to spot in the callers whether the line
was truncated despite LF being found or not. So, label it clearly with a
variable.
pull/8994/head
Shivani Bhardwaj 3 years ago committed by Victor Julien
parent aee7838ce1
commit c229621be4

@ -391,6 +391,7 @@ static AppLayerResult FTPGetLineForDirection(
input->consumed = lf_idx - input->buf + 1; input->consumed = lf_idx - input->buf + 1;
line->len = input->consumed - o_consumed; line->len = input->consumed - o_consumed;
input->len -= line->len; input->len -= line->len;
line->lf_found = true;
DEBUG_VALIDATE_BUG_ON((input->consumed + input->len) != input->orig_len); DEBUG_VALIDATE_BUG_ON((input->consumed + input->len) != input->orig_len);
line->buf = input->buf + o_consumed; line->buf = input->buf + o_consumed;
if (line->len >= ftp_max_line_len) { if (line->len >= ftp_max_line_len) {
@ -511,7 +512,7 @@ static AppLayerResult FTPParseRequest(Flow *f, void *ftp_state, AppLayerParserSt
} }
FtpInput ftpi = { .buf = input, .len = input_len, .orig_len = input_len, .consumed = 0 }; FtpInput ftpi = { .buf = input, .len = input_len, .orig_len = input_len, .consumed = 0 };
FtpLineState line = { .buf = NULL, .len = 0, .delim_len = 0 }; FtpLineState line = { .buf = NULL, .len = 0, .delim_len = 0, .lf_found = false };
uint8_t direction = STREAM_TOSERVER; uint8_t direction = STREAM_TOSERVER;
AppLayerResult res; AppLayerResult res;
@ -539,6 +540,9 @@ static AppLayerResult FTPParseRequest(Flow *f, void *ftp_state, AppLayerParserSt
tx->request_length = CopyCommandLine(&tx->request, &line); tx->request_length = CopyCommandLine(&tx->request, &line);
tx->request_truncated = state->current_line_truncated_ts; tx->request_truncated = state->current_line_truncated_ts;
if (line.lf_found) {
state->current_line_truncated_ts = false;
}
if (tx->request_truncated) { if (tx->request_truncated) {
AppLayerDecoderEventsSetEventRaw(&tx->tx_data.events, FtpEventRequestCommandTooLong); AppLayerDecoderEventsSetEventRaw(&tx->tx_data.events, FtpEventRequestCommandTooLong);
} }
@ -701,7 +705,7 @@ static AppLayerResult FTPParseResponse(Flow *f, void *ftp_state, AppLayerParserS
SCReturnStruct(APP_LAYER_OK); SCReturnStruct(APP_LAYER_OK);
} }
FtpInput ftpi = { .buf = input, .len = input_len, .orig_len = input_len, .consumed = 0 }; FtpInput ftpi = { .buf = input, .len = input_len, .orig_len = input_len, .consumed = 0 };
FtpLineState line = { .buf = NULL, .len = 0, .delim_len = 0 }; FtpLineState line = { .buf = NULL, .len = 0, .delim_len = 0, .lf_found = false };
FTPTransaction *lasttx = TAILQ_FIRST(&state->tx_list); FTPTransaction *lasttx = TAILQ_FIRST(&state->tx_list);
AppLayerResult res; AppLayerResult res;
@ -782,6 +786,9 @@ static AppLayerResult FTPParseResponse(Flow *f, void *ftp_state, AppLayerParserS
AppLayerDecoderEventsSetEventRaw( AppLayerDecoderEventsSetEventRaw(
&tx->tx_data.events, FtpEventResponseCommandTooLong); &tx->tx_data.events, FtpEventResponseCommandTooLong);
} }
if (line.lf_found) {
state->current_line_truncated_tc = false;
}
TAILQ_INSERT_TAIL(&tx->response_list, response, next); TAILQ_INSERT_TAIL(&tx->response_list, response, next);
} }
} }

@ -105,6 +105,7 @@ typedef struct FtpLineState_ {
const uint8_t *buf; const uint8_t *buf;
uint32_t len; uint32_t len;
uint8_t delim_len; uint8_t delim_len;
bool lf_found;
} FtpLineState; } FtpLineState;
typedef struct FTPString_ { typedef struct FTPString_ {

Loading…
Cancel
Save