Introduce new filtering architecture
This change introduces new filtering architecture primitives: filter,
filter_action and bool_expression. Filtering is now done after decoding of
syscall and tcp->qual_flg stores filtering results.
* basic_actions.c: New file.
* filter_action.c: Likewise.
* filter_expression.c: Likewise.
* filter.c: Likewise.
* basic_filters.c (parse_syscall_filter, run_syscall_filter,
free_syscall_filter): New functions.
* defs.h (filter_syscall, filtering_parsing_finish): Add new declarations.
* filter.h: Add new declarations.
* filter_qualify.c (abbrev_set, raw_set, trace_set, verbose_set):
Remove set variables.
(qualify_trace, qualify_abbrev, qualify_verbose, qualify_raw):
Use new filtering API.
(qual_flags): Remove QUAL_* flags for trace, abbrev, verbose, raw.
* strace.c (init): Call filtering_parse_finish after command line parsing.
(trace_syscall): Add filtering after syscall decoding.
* Makefile.am (strace_SOURCES): Add new files.
2017-08-26 16:50:25 +03:00
/*
* Copyright ( c ) 2017 Nikolay Marchuk < marchuk . nikolay . a @ gmail . com >
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# include "defs.h"
# include "filter.h"
bool
is_traced ( struct tcb * tcp )
{
return traced ( tcp ) ;
}
Implement inject and fault actions
* basic_actions.c (not_injected, apply_inject, parse_inject_common,
parse_inject, apply_fault, parse_fault): New functions.
* defs.h (struct inject_opts): Add init flag.
(qual_flags): Remove declaration.
* filter_action.c (action_types): Add inject and fault action types.
(set_filter_action_priv_data): New function.
* filter_qualify.c (inject_set): Remove variable.
(parse_inject_expression): Remove function.
(parse_inject_common_args): Add function for inject/fault arguments parsing.
(qualify_inject_common): Use parse_inject_common_args instead of
parse_inject_expression, use new filtering API.
(qualify_fault, qualify_inject): Remove "argument" from description
argument of qualify_inject_common.
(qual_flags): Remove function.
* filter.h (parse_inject_common_args, not_injected,
set_filter_action_priv_data): New declarations.
(DECL_FILTER_ACTION): Declare inject and fault actions.
(DECL_FILTER_ACTION_PARSER): Declare inject and fault action parsers.
* strace.c (trace_syscall): Call filter_syscall only when tcp->qual_flg
is empty.
* syscall.c (decode_socket_subcall): Remove qual_flags from decoder.
(decode_ipc_subcall): Likewise.
(decode_mips_subcall): Likewise.
(get_scno): Likewise.
(inject_vec, tamper_with_syscall_entering): Remove inject_vec support code.
2017-08-27 08:09:04 +03:00
bool
not_injected ( struct tcb * tcp )
{
return ! inject ( tcp ) ;
}
Introduce new filtering architecture
This change introduces new filtering architecture primitives: filter,
filter_action and bool_expression. Filtering is now done after decoding of
syscall and tcp->qual_flg stores filtering results.
* basic_actions.c: New file.
* filter_action.c: Likewise.
* filter_expression.c: Likewise.
* filter.c: Likewise.
* basic_filters.c (parse_syscall_filter, run_syscall_filter,
free_syscall_filter): New functions.
* defs.h (filter_syscall, filtering_parsing_finish): Add new declarations.
* filter.h: Add new declarations.
* filter_qualify.c (abbrev_set, raw_set, trace_set, verbose_set):
Remove set variables.
(qualify_trace, qualify_abbrev, qualify_verbose, qualify_raw):
Use new filtering API.
(qual_flags): Remove QUAL_* flags for trace, abbrev, verbose, raw.
* strace.c (init): Call filtering_parse_finish after command line parsing.
(trace_syscall): Add filtering after syscall decoding.
* Makefile.am (strace_SOURCES): Add new files.
2017-08-26 16:50:25 +03:00
void *
parse_null ( const char * str )
{
return NULL ;
}
void
apply_trace ( struct tcb * tcp , void * priv_data )
{
tcp - > qual_flg | = QUAL_TRACE ;
}
void
apply_raw ( struct tcb * tcp , void * priv_data )
{
tcp - > qual_flg | = QUAL_RAW ;
}
void
apply_abbrev ( struct tcb * tcp , void * priv_data )
{
tcp - > qual_flg | = QUAL_ABBREV ;
}
void
apply_verbose ( struct tcb * tcp , void * priv_data )
{
tcp - > qual_flg | = QUAL_VERBOSE ;
}
Implement inject and fault actions
* basic_actions.c (not_injected, apply_inject, parse_inject_common,
parse_inject, apply_fault, parse_fault): New functions.
* defs.h (struct inject_opts): Add init flag.
(qual_flags): Remove declaration.
* filter_action.c (action_types): Add inject and fault action types.
(set_filter_action_priv_data): New function.
* filter_qualify.c (inject_set): Remove variable.
(parse_inject_expression): Remove function.
(parse_inject_common_args): Add function for inject/fault arguments parsing.
(qualify_inject_common): Use parse_inject_common_args instead of
parse_inject_expression, use new filtering API.
(qualify_fault, qualify_inject): Remove "argument" from description
argument of qualify_inject_common.
(qual_flags): Remove function.
* filter.h (parse_inject_common_args, not_injected,
set_filter_action_priv_data): New declarations.
(DECL_FILTER_ACTION): Declare inject and fault actions.
(DECL_FILTER_ACTION_PARSER): Declare inject and fault action parsers.
* strace.c (trace_syscall): Call filter_syscall only when tcp->qual_flg
is empty.
* syscall.c (decode_socket_subcall): Remove qual_flags from decoder.
(decode_ipc_subcall): Likewise.
(decode_mips_subcall): Likewise.
(get_scno): Likewise.
(inject_vec, tamper_with_syscall_entering): Remove inject_vec support code.
2017-08-27 08:09:04 +03:00
void
apply_inject ( struct tcb * tcp , void * priv_data )
{
struct inject_opts * opts = priv_data ;
tcp - > qual_flg | = QUAL_INJECT ;
if ( ! tcp - > inject_vec [ current_personality ] )
tcp - > inject_vec [ current_personality ] =
xcalloc ( nsyscalls , sizeof ( struct inject_opts ) ) ;
if ( scno_in_range ( tcp - > scno )
& & ! tcp - > inject_vec [ current_personality ] [ tcp - > scno ] . data . flags )
tcp - > inject_vec [ current_personality ] [ tcp - > scno ] = * opts ;
}
static void *
parse_inject_common ( const char * str , bool fault_tokens_only ,
const char * description )
{
struct inject_opts * opts = xmalloc ( sizeof ( struct inject_opts ) ) ;
char * buf = xstrdup ( str ) ;
parse_inject_common_args ( buf , opts , fault_tokens_only , false ) ;
if ( ! opts - > data . flags )
error_msg_and_die ( " invalid %s argument '%s' " ,
description , str ? str : " " ) ;
free ( buf ) ;
return opts ;
}
void *
parse_inject ( const char * str )
{
return parse_inject_common ( str , false , " inject " ) ;
}
void
apply_fault ( struct tcb * tcp , void * priv_data )
{
apply_inject ( tcp , priv_data ) ;
}
void *
parse_fault ( const char * str )
{
return parse_inject_common ( str , true , " fault " ) ;
}
2017-08-27 15:42:28 +03:00
void
apply_read ( struct tcb * tcp , void * _priv_data )
{
tcp - > qual_flg | = QUAL_READ ;
}
void
apply_write ( struct tcb * tcp , void * _priv_data )
{
tcp - > qual_flg | = QUAL_WRITE ;
}