@ -480,7 +480,8 @@ static AppLayerResult FTPParseRequest(Flow *f, void *ftp_state, AppLayerParserSt
* control direction .
*/
if ( ( state - > active & &
( state - > command = = FTP_COMMAND_STOR | | state - > command = = FTP_COMMAND_APPE ) ) | |
( state - > command = = FTP_COMMAND_STOR | | state - > command = = FTP_COMMAND_APPE | |
state - > command = = FTP_COMMAND_STOU ) ) | |
( ! state - > active & &
( state - > command = = FTP_COMMAND_RETR | | state - > command = = FTP_COMMAND_NLST | |
state - > command = = FTP_COMMAND_LIST | |
@ -526,6 +527,11 @@ static AppLayerResult FTPParseRequest(Flow *f, void *ftp_state, AppLayerParserSt
}
has_file = true ;
/* fallthrough */
case FTP_COMMAND_STOU :
if ( line . len > = 6 ) {
has_file = true ;
}
/* fallthrough */
case FTP_COMMAND_NLST :
case FTP_COMMAND_LIST :
case FTP_COMMAND_MLSD : {
@ -561,6 +567,17 @@ static AppLayerResult FTPParseRequest(Flow *f, void *ftp_state, AppLayerParserSt
data - > file_name [ file_name_len ] = 0 ;
data - > file_len = ( uint16_t ) file_name_len ;
memcpy ( data - > file_name , line . buf + 5 , file_name_len ) ;
} else if ( state - > command = = FTP_COMMAND_STOU ) {
const char default_file_name [ ] = " <stou> " ;
uint32_t file_name_len = sizeof ( default_file_name ) ;
data - > file_name = FTPCalloc ( file_name_len , sizeof ( char ) ) ;
if ( data - > file_name = = NULL ) {
FtpTransferCmdFree ( data ) ;
SCReturnStruct ( APP_LAYER_ERROR ) ;
}
data - > file_name [ file_name_len - 1 ] = 0 ;
data - > file_len = ( uint16_t ) file_name_len - 1 ;
memcpy ( data - > file_name , default_file_name , file_name_len ) ;
}
int ret = AppLayerExpectationCreate (
f , direction , 0 , state - > dyn_port , ALPROTO_FTPDATA , data ) ;
@ -1083,6 +1100,11 @@ static AppLayerResult FTPDataParse(Flow *f, FtpDataState *ftpdata_state,
SCLogDebug ( " APPE data to %s " ,
( ftpdata_state - > direction & STREAM_TOSERVER ) ? " toserver " : " toclient " ) ;
break ;
case FTP_COMMAND_STOU :
ftpdata_state - > direction = data - > direction ;
SCLogDebug ( " STOU data to %s " ,
( ftpdata_state - > direction & STREAM_TOSERVER ) ? " toserver " : " toclient " ) ;
break ;
case FTP_COMMAND_RETR :
ftpdata_state - > direction = data - > direction ;
SCLogDebug ( " RETR data to %s " ,
@ -1457,6 +1479,9 @@ bool EveFTPDataAddMetadata(void *vtx, SCJsonBuilder *jb)
case FTP_COMMAND_APPE :
JB_SET_STRING ( jb , " command " , " APPE " ) ;
break ;
case FTP_COMMAND_STOU :
JB_SET_STRING ( jb , " command " , " STOU " ) ;
break ;
case FTP_COMMAND_RETR :
JB_SET_STRING ( jb , " command " , " RETR " ) ;
break ;