@ -891,12 +891,10 @@ static uint32_t DCERPCParseBIND(DCERPC *dcerpc, uint8_t *input, uint32_t input_l
TAILQ_REMOVE ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list , item , next ) ;
TAILQ_REMOVE ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list , item , next ) ;
SCFree ( item ) ;
SCFree ( item ) ;
}
}
TAILQ_INIT ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list ) ;
}
}
dcerpc - > dcerpcbindbindack . uuid_internal_id = 0 ;
dcerpc - > dcerpcbindbindack . uuid_internal_id = 0 ;
dcerpc - > dcerpcbindbindack . numctxitems = * ( p + 8 ) ;
dcerpc - > dcerpcbindbindack . numctxitems = * ( p + 8 ) ;
dcerpc - > dcerpcbindbindack . numctxitemsleft = dcerpc - > dcerpcbindbindack . numctxitems ;
dcerpc - > dcerpcbindbindack . numctxitemsleft = dcerpc - > dcerpcbindbindack . numctxitems ;
TAILQ_INIT ( & dcerpc - > dcerpcbindbindack . uuid_list ) ;
dcerpc - > bytesprocessed + = 12 ;
dcerpc - > bytesprocessed + = 12 ;
SCReturnUInt ( 12U ) ;
SCReturnUInt ( 12U ) ;
} else {
} else {
@ -958,12 +956,10 @@ static uint32_t DCERPCParseBIND(DCERPC *dcerpc, uint8_t *input, uint32_t input_l
TAILQ_REMOVE ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list , item , next ) ;
TAILQ_REMOVE ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list , item , next ) ;
SCFree ( item ) ;
SCFree ( item ) ;
}
}
TAILQ_INIT ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list ) ;
}
}
dcerpc - > dcerpcbindbindack . uuid_internal_id = 0 ;
dcerpc - > dcerpcbindbindack . uuid_internal_id = 0 ;
dcerpc - > dcerpcbindbindack . numctxitems = * ( p + + ) ;
dcerpc - > dcerpcbindbindack . numctxitems = * ( p + + ) ;
dcerpc - > dcerpcbindbindack . numctxitemsleft = dcerpc - > dcerpcbindbindack . numctxitems ;
dcerpc - > dcerpcbindbindack . numctxitemsleft = dcerpc - > dcerpcbindbindack . numctxitems ;
TAILQ_INIT ( & dcerpc - > dcerpcbindbindack . uuid_list ) ;
if ( ! ( - - input_len ) )
if ( ! ( - - input_len ) )
break ;
break ;
/* fall through */
/* fall through */
@ -1952,49 +1948,59 @@ static int DCERPCParseResponse(Flow *f, void *dcerpc_state,
local_data , 1 ) ;
local_data , 1 ) ;
}
}
void DCERPCInit ( DCERPC * dcerpc )
{
dcerpc - > transaction_id = 1 ;
TAILQ_INIT ( & dcerpc - > dcerpcbindbindack . uuid_list ) ;
TAILQ_INIT ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list ) ;
}
static void * DCERPCStateAlloc ( void )
static void * DCERPCStateAlloc ( void )
{
{
SCEnter ( ) ;
SCEnter ( ) ;
DCERPCState * s = SCMalloc ( sizeof ( DCERPCState ) ) ;
DCERPCState * s = SC Calloc( 1 , sizeof ( DCERPCState ) ) ;
if ( unlikely ( s = = NULL ) ) {
if ( unlikely ( s = = NULL ) ) {
SCReturnPtr ( NULL , " void " ) ;
SCReturnPtr ( NULL , " void " ) ;
}
}
memset ( s , 0 , sizeof ( DCERPCState ) ) ;
s - > dcerpc . transaction_id = 1 ;
DCERPCInit ( & s - > dcerpc ) ;
SCReturnPtr ( ( void * ) s , " void " ) ;
SCReturnPtr ( ( void * ) s , " void " ) ;
}
}
static void DCERPCStateFree ( void * s )
void DCERPCCleanup ( DCERPC * dcerpc )
{
{
DCERPCState * sstate = ( DCERPCState * ) s ;
DCERPCUuidEntry * entry ;
DCERPCUuidEntry * item ;
while ( ( item = TAILQ_FIRST ( & sstate - > dcerpc . dcerpcbindbindack . uuid_list ) ) ) {
while ( ( entry = TAILQ_FIRST ( & dcerpc - > dcerpcbindbindack . uuid_list ) ) ) {
//printUUID("Free", item);
TAILQ_REMOVE ( & dcerpc - > dcerpcbindbindack . uuid_list , entry , next ) ;
TAILQ_REMOVE ( & sstate - > dcerpc . dcerpcbindbindack . uuid_list , item , next ) ;
SCFree ( entry ) ;
SCFree ( item ) ;
}
}
while ( ( item = TAILQ_FIRST ( & sstate - > dcerpc . dcerpcbindbindack . accepted_uuid_list ) ) ) {
while ( ( entry = TAILQ_FIRST ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list ) ) ) {
//printUUID("Free", item);
TAILQ_REMOVE ( & dcerpc - > dcerpcbindbindack . accepted_uuid_list , entry , next ) ;
TAILQ_REMOVE ( & sstate - > dcerpc . dcerpcbindbindack . accepted_uuid_list , item , next ) ;
SCFree ( entry ) ;
SCFree ( item ) ;
}
}
if ( sstate- > dcerpc . dcerpcrequest . stub_data_buffer ! = NULL ) {
if ( dcerpc- > dcerpcrequest . stub_data_buffer ! = NULL ) {
SCFree ( sstate- > dcerpc . dcerpcrequest . stub_data_buffer ) ;
SCFree ( dcerpc- > dcerpcrequest . stub_data_buffer ) ;
sstate- > dcerpc . dcerpcrequest . stub_data_buffer = NULL ;
dcerpc- > dcerpcrequest . stub_data_buffer = NULL ;
sstate- > dcerpc . dcerpcrequest . stub_data_buffer_len = 0 ;
dcerpc- > dcerpcrequest . stub_data_buffer_len = 0 ;
}
}
if ( sstate- > dcerpc . dcerpcresponse . stub_data_buffer ! = NULL ) {
if ( dcerpc- > dcerpcresponse . stub_data_buffer ! = NULL ) {
SCFree ( sstate- > dcerpc . dcerpcresponse . stub_data_buffer ) ;
SCFree ( dcerpc- > dcerpcresponse . stub_data_buffer ) ;
sstate- > dcerpc . dcerpcresponse . stub_data_buffer = NULL ;
dcerpc- > dcerpcresponse . stub_data_buffer = NULL ;
sstate- > dcerpc . dcerpcresponse . stub_data_buffer_len = 0 ;
dcerpc- > dcerpcresponse . stub_data_buffer_len = 0 ;
}
}
}
static void DCERPCStateFree ( void * s )
{
DCERPCState * sstate = ( DCERPCState * ) s ;
DCERPCCleanup ( & sstate - > dcerpc ) ;
SCFree ( s ) ;
SCFree ( s ) ;
}
}