mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-27 20:25:12 +00:00
Update input validation. Always use the magic CHECK macro, which prints an error message including instructions on how to report this problem.
darcs-hash:20060621004836-ac50b-a47f296634eda0c469eb39034603015b1ad7ab5c.gz
This commit is contained in:
parent
7268a4a4e0
commit
b016438c08
12 changed files with 139 additions and 224 deletions
32
builtin.c
32
builtin.c
|
@ -3015,12 +3015,8 @@ void builtin_destroy()
|
||||||
|
|
||||||
int builtin_exists( wchar_t *cmd )
|
int builtin_exists( wchar_t *cmd )
|
||||||
{
|
{
|
||||||
if( !cmd )
|
CHECK( cmd, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Count is not a builtin, but it's help is handled internally by
|
Count is not a builtin, but it's help is handled internally by
|
||||||
fish, so it is in the hash_table_t.
|
fish, so it is in the hash_table_t.
|
||||||
|
@ -3052,12 +3048,9 @@ int builtin_run( wchar_t **argv )
|
||||||
{
|
{
|
||||||
int (*cmd)(wchar_t **argv)=0;
|
int (*cmd)(wchar_t **argv)=0;
|
||||||
|
|
||||||
if( !argv || !argv[0] )
|
CHECK( argv, 1 );
|
||||||
{
|
CHECK( argv[0], 1 );
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd = (int (*)(wchar_t **))hash_get( &builtin, argv[0] );
|
cmd = (int (*)(wchar_t **))hash_get( &builtin, argv[0] );
|
||||||
|
|
||||||
if( argv[1] != 0 && !internal_help(argv[0]) )
|
if( argv[1] != 0 && !internal_help(argv[0]) )
|
||||||
|
@ -3087,24 +3080,15 @@ int builtin_run( wchar_t **argv )
|
||||||
|
|
||||||
void builtin_get_names( array_list_t *list )
|
void builtin_get_names( array_list_t *list )
|
||||||
{
|
{
|
||||||
if( !list )
|
CHECK( list, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_get_keys( &builtin, list );
|
hash_get_keys( &builtin, list );
|
||||||
}
|
}
|
||||||
|
|
||||||
const wchar_t *builtin_get_desc( const wchar_t *b )
|
const wchar_t *builtin_get_desc( const wchar_t *b )
|
||||||
{
|
{
|
||||||
if( !b )
|
CHECK( b, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if( !desc )
|
if( !desc )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
33
common.c
33
common.c
|
@ -495,12 +495,8 @@ int contains_str( const wchar_t *a, ... )
|
||||||
va_list va;
|
va_list va;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
if( !a )
|
CHECK( a, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start( va, a );
|
va_start( va, a );
|
||||||
while( (arg=va_arg(va, wchar_t *) )!= 0 )
|
while( (arg=va_arg(va, wchar_t *) )!= 0 )
|
||||||
{
|
{
|
||||||
|
@ -546,12 +542,8 @@ void debug( int level, const wchar_t *msg, ... )
|
||||||
string_buffer_t sb;
|
string_buffer_t sb;
|
||||||
string_buffer_t sb2;
|
string_buffer_t sb2;
|
||||||
|
|
||||||
if( !msg )
|
CHECK( msg, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( level > debug_level )
|
if( level > debug_level )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -578,12 +570,9 @@ void write_screen( const wchar_t *msg, string_buffer_t *buff )
|
||||||
int tok_width = 0;
|
int tok_width = 0;
|
||||||
int screen_width = common_get_width();
|
int screen_width = common_get_width();
|
||||||
|
|
||||||
if( !msg || !buff )
|
CHECK( msg, );
|
||||||
{
|
CHECK( buff, );
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( screen_width )
|
if( screen_width )
|
||||||
{
|
{
|
||||||
start = pos = msg;
|
start = pos = msg;
|
||||||
|
@ -799,12 +788,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
|
||||||
wchar_t prev=0;
|
wchar_t prev=0;
|
||||||
wchar_t *in;
|
wchar_t *in;
|
||||||
|
|
||||||
if( !orig )
|
CHECK( orig, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = wcslen( orig );
|
len = wcslen( orig );
|
||||||
in = wcsdup( orig );
|
in = wcsdup( orig );
|
||||||
|
|
||||||
|
|
20
common.h
20
common.h
|
@ -67,6 +67,26 @@ extern char *profile;
|
||||||
*/
|
*/
|
||||||
extern wchar_t *program_name;
|
extern wchar_t *program_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
This macro is used to check that an input argument is not null. It
|
||||||
|
is a bit lika a non-fatal form of assert. Instead of exit-ing on
|
||||||
|
failiure, the current function is ended at once. The second
|
||||||
|
parameter is the exit status of the current function on failiure.
|
||||||
|
*/
|
||||||
|
#define CHECK( arg, retval ) \
|
||||||
|
if( !(arg) ) \
|
||||||
|
{ \
|
||||||
|
debug( 1, \
|
||||||
|
L"function %s called with null value for argument %s. " \
|
||||||
|
L"This is a bug. " \
|
||||||
|
L"If you can reproduce it, please send a bug report to %s.", \
|
||||||
|
__func__, \
|
||||||
|
#arg, \
|
||||||
|
PACKAGE_BUGREPORT ); \
|
||||||
|
return retval; \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Take an array_list_t containing wide strings and converts them to a
|
Take an array_list_t containing wide strings and converts them to a
|
||||||
single null-terminated wchar_t **. The array is allocated using
|
single null-terminated wchar_t **. The array is allocated using
|
||||||
|
|
42
complete.c
42
complete.c
|
@ -389,12 +389,8 @@ void complete_add( const wchar_t *cmd,
|
||||||
complete_entry *c;
|
complete_entry *c;
|
||||||
complete_entry_opt *opt;
|
complete_entry_opt *opt;
|
||||||
|
|
||||||
if( !cmd )
|
CHECK( cmd, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
c = complete_find_exact_entry( cmd, cmd_type );
|
c = complete_find_exact_entry( cmd, cmd_type );
|
||||||
|
|
||||||
if( c == 0 )
|
if( c == 0 )
|
||||||
|
@ -461,12 +457,8 @@ void complete_remove( const wchar_t *cmd,
|
||||||
{
|
{
|
||||||
complete_entry *e, *eprev=0, *enext=0;
|
complete_entry *e, *eprev=0, *enext=0;
|
||||||
|
|
||||||
if( !cmd )
|
CHECK( cmd, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for( e = first_entry; e; e=enext )
|
for( e = first_entry; e; e=enext )
|
||||||
{
|
{
|
||||||
enext=e->next;
|
enext=e->next;
|
||||||
|
@ -615,12 +607,9 @@ int complete_is_valid_option( const wchar_t *str,
|
||||||
|
|
||||||
void *context;
|
void *context;
|
||||||
|
|
||||||
if( !str || !opt )
|
CHECK( str, 0 );
|
||||||
{
|
CHECK( opt, 0 );
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check some generic things like -- and - options.
|
Check some generic things like -- and - options.
|
||||||
*/
|
*/
|
||||||
|
@ -942,12 +931,8 @@ const wchar_t *complete_get_desc( const wchar_t *filename )
|
||||||
{
|
{
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
|
|
||||||
if( !filename )
|
CHECK( filename, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !get_desc_buff )
|
if( !get_desc_buff )
|
||||||
{
|
{
|
||||||
get_desc_buff = sb_halloc( global_context);
|
get_desc_buff = sb_halloc( global_context);
|
||||||
|
@ -1978,12 +1963,9 @@ void complete( const wchar_t *cmd,
|
||||||
|
|
||||||
int cursor_pos = wcslen(cmd );
|
int cursor_pos = wcslen(cmd );
|
||||||
|
|
||||||
if( !cmd || !comp )
|
CHECK( cmd, );
|
||||||
{
|
CHECK( comp, );
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
If we are completing a variable name or a tilde expansion user
|
If we are completing a variable name or a tilde expansion user
|
||||||
name, we do that and return. No need for any other competions.
|
name, we do that and return. No need for any other competions.
|
||||||
|
|
32
env.c
32
env.c
|
@ -627,12 +627,8 @@ int env_set( const wchar_t *key,
|
||||||
event_t ev;
|
event_t ev;
|
||||||
int is_universal = 0;
|
int is_universal = 0;
|
||||||
|
|
||||||
if( !key )
|
CHECK( key, ENV_INVALID );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return ENV_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( (var_mode & ENV_USER ) &&
|
if( (var_mode & ENV_USER ) &&
|
||||||
hash_get( &env_read_only, key ) )
|
hash_get( &env_read_only, key ) )
|
||||||
{
|
{
|
||||||
|
@ -877,12 +873,8 @@ int env_remove( const wchar_t *key, int var_mode )
|
||||||
env_node_t *first_node;
|
env_node_t *first_node;
|
||||||
int erased = 0;
|
int erased = 0;
|
||||||
|
|
||||||
if( !key )
|
CHECK( key, 1 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( (var_mode & ENV_USER ) &&
|
if( (var_mode & ENV_USER ) &&
|
||||||
hash_get( &env_read_only, key ) )
|
hash_get( &env_read_only, key ) )
|
||||||
{
|
{
|
||||||
|
@ -941,12 +933,8 @@ wchar_t *env_get( const wchar_t *key )
|
||||||
env_node_t *env = top;
|
env_node_t *env = top;
|
||||||
wchar_t *item;
|
wchar_t *item;
|
||||||
|
|
||||||
if( !key )
|
CHECK( key, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( wcscmp( key, L"history" ) == 0 )
|
if( wcscmp( key, L"history" ) == 0 )
|
||||||
{
|
{
|
||||||
wchar_t *current;
|
wchar_t *current;
|
||||||
|
@ -1045,12 +1033,8 @@ int env_exist( const wchar_t *key, int mode )
|
||||||
env_node_t *env;
|
env_node_t *env;
|
||||||
wchar_t *item=0;
|
wchar_t *item=0;
|
||||||
|
|
||||||
if( !key )
|
CHECK( key, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Read only variables all exist, and they are all global. A local
|
Read only variables all exist, and they are all global. A local
|
||||||
version can not exist.
|
version can not exist.
|
||||||
|
|
8
exec.c
8
exec.c
|
@ -652,12 +652,8 @@ void exec( job_t *j )
|
||||||
*/
|
*/
|
||||||
int exec_error=0;
|
int exec_error=0;
|
||||||
|
|
||||||
if( !j )
|
CHECK( j, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( no_exec )
|
if( no_exec )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
11
expand.c
11
expand.c
|
@ -101,6 +101,8 @@ int expand_is_clean( const wchar_t *in )
|
||||||
|
|
||||||
const wchar_t * str = in;
|
const wchar_t * str = in;
|
||||||
|
|
||||||
|
CHECK( in, 1 );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Test characters that have a special meaning in the first character position
|
Test characters that have a special meaning in the first character position
|
||||||
*/
|
*/
|
||||||
|
@ -161,6 +163,8 @@ wchar_t *expand_escape_variable( const wchar_t *in )
|
||||||
array_list_t l;
|
array_list_t l;
|
||||||
string_buffer_t buff;
|
string_buffer_t buff;
|
||||||
|
|
||||||
|
CHECK( in, 0 );
|
||||||
|
|
||||||
al_init( &l );
|
al_init( &l );
|
||||||
tokenize_variable_array( in, &l );
|
tokenize_variable_array( in, &l );
|
||||||
sb_init( &buff );
|
sb_init( &buff );
|
||||||
|
@ -1316,6 +1320,8 @@ static wchar_t * expand_tilde_internal( wchar_t *in )
|
||||||
|
|
||||||
wchar_t *expand_tilde( wchar_t *in)
|
wchar_t *expand_tilde( wchar_t *in)
|
||||||
{
|
{
|
||||||
|
CHECK( in, 0 );
|
||||||
|
|
||||||
if( in[0] == L'~' )
|
if( in[0] == L'~' )
|
||||||
{
|
{
|
||||||
in[0] = HOME_DIRECTORY;
|
in[0] = HOME_DIRECTORY;
|
||||||
|
@ -1374,6 +1380,9 @@ int expand_string( void *context,
|
||||||
int res = EXPAND_OK;
|
int res = EXPAND_OK;
|
||||||
int start_count = al_get_count( end_out );
|
int start_count = al_get_count( end_out );
|
||||||
|
|
||||||
|
CHECK( str, EXPAND_ERROR );
|
||||||
|
CHECK( end_out, EXPAND_ERROR );
|
||||||
|
|
||||||
if( (!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean( str ) )
|
if( (!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean( str ) )
|
||||||
{
|
{
|
||||||
halloc_register( context, str );
|
halloc_register( context, str );
|
||||||
|
@ -1619,6 +1628,8 @@ wchar_t *expand_one( void *context, wchar_t *string, int flags )
|
||||||
array_list_t l;
|
array_list_t l;
|
||||||
int res;
|
int res;
|
||||||
wchar_t *one;
|
wchar_t *one;
|
||||||
|
|
||||||
|
CHECK( string, 0 );
|
||||||
|
|
||||||
if( (!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean( string ) )
|
if( (!(flags & ACCEPT_INCOMPLETE)) && expand_is_clean( string ) )
|
||||||
{
|
{
|
||||||
|
|
71
function.c
71
function.c
|
@ -176,13 +176,9 @@ void function_add( const wchar_t *name,
|
||||||
wchar_t *cmd_end;
|
wchar_t *cmd_end;
|
||||||
function_data_t *d;
|
function_data_t *d;
|
||||||
|
|
||||||
|
CHECK( name, );
|
||||||
|
CHECK( val, );
|
||||||
|
|
||||||
if( !name || !val )
|
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
function_remove( name );
|
function_remove( name );
|
||||||
|
|
||||||
d = malloc( sizeof( function_data_t ) );
|
d = malloc( sizeof( function_data_t ) );
|
||||||
|
@ -212,12 +208,8 @@ void function_add( const wchar_t *name,
|
||||||
int function_exists( const wchar_t *cmd )
|
int function_exists( const wchar_t *cmd )
|
||||||
{
|
{
|
||||||
|
|
||||||
if( !cmd )
|
CHECK( cmd, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( parser_is_reserved(cmd) )
|
if( parser_is_reserved(cmd) )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -232,12 +224,8 @@ void function_remove( const wchar_t *name )
|
||||||
function_data_t *d;
|
function_data_t *d;
|
||||||
event_t ev;
|
event_t ev;
|
||||||
|
|
||||||
if( !name )
|
CHECK( name, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_remove( &function,
|
hash_remove( &function,
|
||||||
name,
|
name,
|
||||||
&key,
|
&key,
|
||||||
|
@ -259,12 +247,8 @@ const wchar_t *function_get_definition( const wchar_t *argv )
|
||||||
{
|
{
|
||||||
function_data_t *data;
|
function_data_t *data;
|
||||||
|
|
||||||
if( !argv )
|
CHECK( argv, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
load( argv );
|
load( argv );
|
||||||
data = (function_data_t *)hash_get( &function, argv );
|
data = (function_data_t *)hash_get( &function, argv );
|
||||||
if( data == 0 )
|
if( data == 0 )
|
||||||
|
@ -275,12 +259,9 @@ const wchar_t *function_get_definition( const wchar_t *argv )
|
||||||
const wchar_t *function_get_desc( const wchar_t *argv )
|
const wchar_t *function_get_desc( const wchar_t *argv )
|
||||||
{
|
{
|
||||||
function_data_t *data;
|
function_data_t *data;
|
||||||
if( !argv )
|
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
CHECK( argv, 0 );
|
||||||
|
|
||||||
load( argv );
|
load( argv );
|
||||||
data = (function_data_t *)hash_get( &function, argv );
|
data = (function_data_t *)hash_get( &function, argv );
|
||||||
if( data == 0 )
|
if( data == 0 )
|
||||||
|
@ -292,11 +273,9 @@ const wchar_t *function_get_desc( const wchar_t *argv )
|
||||||
void function_set_desc( const wchar_t *name, const wchar_t *desc )
|
void function_set_desc( const wchar_t *name, const wchar_t *desc )
|
||||||
{
|
{
|
||||||
function_data_t *data;
|
function_data_t *data;
|
||||||
if( !name || !desc )
|
|
||||||
{
|
CHECK( name, );
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
CHECK( desc, );
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
load( name );
|
load( name );
|
||||||
data = (function_data_t *)hash_get( &function, name );
|
data = (function_data_t *)hash_get( &function, name );
|
||||||
|
@ -355,12 +334,8 @@ static void get_names_internal_all( void *key,
|
||||||
|
|
||||||
void function_get_names( array_list_t *list, int get_hidden )
|
void function_get_names( array_list_t *list, int get_hidden )
|
||||||
{
|
{
|
||||||
if( !list )
|
CHECK( list, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
autoload_names( list, get_hidden );
|
autoload_names( list, get_hidden );
|
||||||
|
|
||||||
if( get_hidden )
|
if( get_hidden )
|
||||||
|
@ -378,12 +353,8 @@ const wchar_t *function_get_definition_file( const wchar_t *argv )
|
||||||
{
|
{
|
||||||
function_data_t *data;
|
function_data_t *data;
|
||||||
|
|
||||||
if( !argv )
|
CHECK( argv, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
load( argv );
|
load( argv );
|
||||||
data = (function_data_t *)hash_get( &function, argv );
|
data = (function_data_t *)hash_get( &function, argv );
|
||||||
if( data == 0 )
|
if( data == 0 )
|
||||||
|
@ -397,12 +368,8 @@ int function_get_definition_offset( const wchar_t *argv )
|
||||||
{
|
{
|
||||||
function_data_t *data;
|
function_data_t *data;
|
||||||
|
|
||||||
if( !argv )
|
CHECK( argv, -1 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
load( argv );
|
load( argv );
|
||||||
data = (function_data_t *)hash_get( &function, argv );
|
data = (function_data_t *)hash_get( &function, argv );
|
||||||
if( data == 0 )
|
if( data == 0 )
|
||||||
|
|
|
@ -533,14 +533,9 @@ void highlight_shell( wchar_t * buff,
|
||||||
void *context;
|
void *context;
|
||||||
wchar_t *cmd=0;
|
wchar_t *cmd=0;
|
||||||
|
|
||||||
if( !buff || !color )
|
CHECK( buff, );
|
||||||
{
|
CHECK( color, );
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
len = wcslen(buff);
|
len = wcslen(buff);
|
||||||
|
|
||||||
if( !len )
|
if( !len )
|
||||||
|
|
14
parse_util.c
14
parse_util.c
|
@ -52,7 +52,10 @@ int parse_util_lineno( const wchar_t *str, int len )
|
||||||
static wchar_t *prev_str2 = 0;
|
static wchar_t *prev_str2 = 0;
|
||||||
static int i2 = 0;
|
static int i2 = 0;
|
||||||
static int res2 = 1;
|
static int res2 = 1;
|
||||||
|
|
||||||
|
CHECK( str, 0 );
|
||||||
|
|
||||||
|
|
||||||
if( str != prev_str || i>len )
|
if( str != prev_str || i>len )
|
||||||
{
|
{
|
||||||
if( prev_str2 == str && i2 <= len )
|
if( prev_str2 == str && i2 <= len )
|
||||||
|
@ -100,6 +103,8 @@ int parse_util_locate_cmdsubst( const wchar_t *in,
|
||||||
|
|
||||||
wchar_t *paran_begin=0, *paran_end=0;
|
wchar_t *paran_begin=0, *paran_end=0;
|
||||||
|
|
||||||
|
CHECK( in, 0 );
|
||||||
|
|
||||||
for( pos = (wchar_t *)in; *pos; pos++ )
|
for( pos = (wchar_t *)in; *pos; pos++ )
|
||||||
{
|
{
|
||||||
if( prev != '\\' )
|
if( prev != '\\' )
|
||||||
|
@ -176,14 +181,13 @@ void parse_util_cmdsubst_extent( const wchar_t *buff,
|
||||||
wchar_t *begin, *end;
|
wchar_t *begin, *end;
|
||||||
wchar_t *pos;
|
wchar_t *pos;
|
||||||
|
|
||||||
|
CHECK( buff, );
|
||||||
|
|
||||||
if( a )
|
if( a )
|
||||||
*a=0;
|
*a=0;
|
||||||
if( b )
|
if( b )
|
||||||
*b = 0;
|
*b = 0;
|
||||||
|
|
||||||
if( !buff )
|
|
||||||
return;
|
|
||||||
|
|
||||||
pos = (wchar_t *)buff;
|
pos = (wchar_t *)buff;
|
||||||
|
|
||||||
while( 1 )
|
while( 1 )
|
||||||
|
@ -243,6 +247,8 @@ static void job_or_process_extent( const wchar_t *buff,
|
||||||
|
|
||||||
tokenizer tok;
|
tokenizer tok;
|
||||||
|
|
||||||
|
CHECK( buff, );
|
||||||
|
|
||||||
if( a )
|
if( a )
|
||||||
*a=0;
|
*a=0;
|
||||||
if( b )
|
if( b )
|
||||||
|
@ -342,6 +348,8 @@ void parse_util_token_extent( const wchar_t *buff,
|
||||||
|
|
||||||
wchar_t *a, *b, *pa, *pb;
|
wchar_t *a, *b, *pa, *pb;
|
||||||
|
|
||||||
|
CHECK( buff, );
|
||||||
|
|
||||||
assert( cursor_pos >= 0 );
|
assert( cursor_pos >= 0 );
|
||||||
|
|
||||||
|
|
||||||
|
|
49
parser.c
49
parser.c
|
@ -758,12 +758,8 @@ wchar_t *parser_get_filename( void *context, const wchar_t *cmd )
|
||||||
{
|
{
|
||||||
wchar_t *path;
|
wchar_t *path;
|
||||||
|
|
||||||
if( !cmd )
|
CHECK( cmd, 0 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
debug( 3, L"parser_get_filename( '%ls' )", cmd );
|
debug( 3, L"parser_get_filename( '%ls' )", cmd );
|
||||||
|
|
||||||
if(wcschr( cmd, L'/' ) != 0 )
|
if(wcschr( cmd, L'/' ) != 0 )
|
||||||
|
@ -1022,12 +1018,9 @@ int eval_args( const wchar_t *line, array_list_t *args )
|
||||||
int previous_pos=current_tokenizer_pos;
|
int previous_pos=current_tokenizer_pos;
|
||||||
int do_loop=1;
|
int do_loop=1;
|
||||||
|
|
||||||
if( !line || !args )
|
CHECK( line, 1 );
|
||||||
{
|
CHECK( args, 1 );
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
proc_push_interactive(0);
|
proc_push_interactive(0);
|
||||||
current_tokenizer = &tok;
|
current_tokenizer = &tok;
|
||||||
current_tokenizer_pos = 0;
|
current_tokenizer_pos = 0;
|
||||||
|
@ -1103,12 +1096,8 @@ void parser_stack_trace( block_t *b, string_buffer_t *buff)
|
||||||
/*
|
/*
|
||||||
Validate input
|
Validate input
|
||||||
*/
|
*/
|
||||||
if( !buff )
|
CHECK( buff, );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check if we should end the recursion
|
Check if we should end the recursion
|
||||||
*/
|
*/
|
||||||
|
@ -2738,12 +2727,8 @@ static int parser_test_argument( const wchar_t *arg, string_buffer_t *out, const
|
||||||
wchar_t *arg_cpy;
|
wchar_t *arg_cpy;
|
||||||
int do_loop = 1;
|
int do_loop = 1;
|
||||||
|
|
||||||
if( !arg )
|
CHECK( arg, 1 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
arg_cpy = wcsdup( arg );
|
arg_cpy = wcsdup( arg );
|
||||||
|
|
||||||
while( do_loop )
|
while( do_loop )
|
||||||
|
@ -2910,12 +2895,8 @@ int parser_test_args(const wchar_t * buff,
|
||||||
int do_loop = 1;
|
int do_loop = 1;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if( !buff )
|
CHECK( buff, 1 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_tokenizer = &tok;
|
current_tokenizer = &tok;
|
||||||
|
|
||||||
for( tok_init( &tok, buff, 0 );
|
for( tok_init( &tok, buff, 0 );
|
||||||
|
@ -3008,12 +2989,8 @@ int parser_test( const wchar_t * buff,
|
||||||
int arg_count=0;
|
int arg_count=0;
|
||||||
wchar_t *cmd=0;
|
wchar_t *cmd=0;
|
||||||
|
|
||||||
if( !buff )
|
CHECK( buff, 1 );
|
||||||
{
|
|
||||||
debug( 0, L"%s called with null input", __func__ );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
context = halloc( 0, 0 );
|
context = halloc( 0, 0 );
|
||||||
current_tokenizer = &tok;
|
current_tokenizer = &tok;
|
||||||
|
|
||||||
|
|
42
tokenizer.c
42
tokenizer.c
|
@ -29,18 +29,16 @@
|
||||||
Error string for unexpected end of string
|
Error string for unexpected end of string
|
||||||
*/
|
*/
|
||||||
#define EOL_ERROR _( L"Unexpected end of token" )
|
#define EOL_ERROR _( L"Unexpected end of token" )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Error string for mismatched parenthesis
|
Error string for mismatched parenthesis
|
||||||
*/
|
*/
|
||||||
#define PARAN_ERROR _( L"Parenthesis mismatch" )
|
#define PARAN_ERROR _( L"Parenthesis mismatch" )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Error string for invalid redirections
|
Error string for invalid redirections
|
||||||
*/
|
*/
|
||||||
#define REDIRECT_ERROR _( L"Invalid redirection" )
|
#define REDIRECT_ERROR _( L"Invalid redirection" )
|
||||||
/**
|
|
||||||
Error string for invalid input
|
|
||||||
*/
|
|
||||||
#define INPUT_ERROR _( L"Invalid input" )
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Error string for when trying to pipe from fd 0
|
Error string for when trying to pipe from fd 0
|
||||||
|
@ -118,8 +116,9 @@ static void tok_error( tokenizer *tok, const wchar_t *err )
|
||||||
|
|
||||||
void tok_init( tokenizer *tok, const wchar_t *b, int flags )
|
void tok_init( tokenizer *tok, const wchar_t *b, int flags )
|
||||||
{
|
{
|
||||||
// fwprintf( stderr, L"CREATE: \'%ls\'\n", b );
|
|
||||||
|
|
||||||
|
CHECK( tok, );
|
||||||
|
CHECK( b, );
|
||||||
|
|
||||||
memset( tok, 0, sizeof( tokenizer) );
|
memset( tok, 0, sizeof( tokenizer) );
|
||||||
|
|
||||||
|
@ -127,17 +126,6 @@ void tok_init( tokenizer *tok, const wchar_t *b, int flags )
|
||||||
tok->show_comments = flags & TOK_SHOW_COMMENTS;
|
tok->show_comments = flags & TOK_SHOW_COMMENTS;
|
||||||
tok->has_next=1;
|
tok->has_next=1;
|
||||||
|
|
||||||
/*
|
|
||||||
Before we copy the buffer we need to check that it is not
|
|
||||||
null. But before that, we need to init the tokenizer far enough
|
|
||||||
so that errors can be properly flagged
|
|
||||||
*/
|
|
||||||
if( !b )
|
|
||||||
{
|
|
||||||
tok_error( tok, INPUT_ERROR );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
tok->has_next = (*b != L'\0');
|
tok->has_next = (*b != L'\0');
|
||||||
tok->orig_buff = tok->buff = (wchar_t *)(b);
|
tok->orig_buff = tok->buff = (wchar_t *)(b);
|
||||||
|
|
||||||
|
@ -165,6 +153,8 @@ void tok_init( tokenizer *tok, const wchar_t *b, int flags )
|
||||||
|
|
||||||
void tok_destroy( tokenizer *tok )
|
void tok_destroy( tokenizer *tok )
|
||||||
{
|
{
|
||||||
|
CHECK( tok, );
|
||||||
|
|
||||||
free( tok->last );
|
free( tok->last );
|
||||||
if( tok->free_orig )
|
if( tok->free_orig )
|
||||||
free( tok->orig_buff );
|
free( tok->orig_buff );
|
||||||
|
@ -172,11 +162,15 @@ void tok_destroy( tokenizer *tok )
|
||||||
|
|
||||||
int tok_last_type( tokenizer *tok )
|
int tok_last_type( tokenizer *tok )
|
||||||
{
|
{
|
||||||
|
CHECK( tok, 0 );
|
||||||
|
|
||||||
return tok->last_type;
|
return tok->last_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t *tok_last( tokenizer *tok )
|
wchar_t *tok_last( tokenizer *tok )
|
||||||
{
|
{
|
||||||
|
CHECK( tok, 0 );
|
||||||
|
|
||||||
return tok->last;
|
return tok->last;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,6 +464,8 @@ static void read_redirect( tokenizer *tok, int fd )
|
||||||
|
|
||||||
wchar_t tok_last_quote( tokenizer *tok )
|
wchar_t tok_last_quote( tokenizer *tok )
|
||||||
{
|
{
|
||||||
|
CHECK( tok, 0 );
|
||||||
|
|
||||||
return tok->last_quote;
|
return tok->last_quote;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,15 +484,19 @@ static int my_iswspace( wchar_t c )
|
||||||
|
|
||||||
const wchar_t *tok_get_desc( int type )
|
const wchar_t *tok_get_desc( int type )
|
||||||
{
|
{
|
||||||
|
if( type < 0 || type >= sizeof( tok_desc ) )
|
||||||
|
{
|
||||||
|
return _(L"Invalid token type");
|
||||||
|
}
|
||||||
return _(tok_desc[type]);
|
return _(tok_desc[type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void tok_next( tokenizer *tok )
|
void tok_next( tokenizer *tok )
|
||||||
{
|
{
|
||||||
// fwprintf( stderr, L"tok_next on %ls (prev=%ls)\n", tok->orig_buff, tok_desc[tok->last_type] );
|
|
||||||
|
|
||||||
|
CHECK( tok, );
|
||||||
|
|
||||||
if( tok_last_type( tok ) == TOK_ERROR )
|
if( tok_last_type( tok ) == TOK_ERROR )
|
||||||
{
|
{
|
||||||
tok->has_next=0;
|
tok->has_next=0;
|
||||||
|
@ -619,6 +619,8 @@ wchar_t *tok_first( const wchar_t *str )
|
||||||
tokenizer t;
|
tokenizer t;
|
||||||
wchar_t *res=0;
|
wchar_t *res=0;
|
||||||
|
|
||||||
|
CHECK( str, 0 );
|
||||||
|
|
||||||
tok_init( &t, str, 0 );
|
tok_init( &t, str, 0 );
|
||||||
|
|
||||||
switch( tok_last_type( &t ) )
|
switch( tok_last_type( &t ) )
|
||||||
|
@ -638,12 +640,16 @@ wchar_t *tok_first( const wchar_t *str )
|
||||||
|
|
||||||
int tok_get_pos( tokenizer *tok )
|
int tok_get_pos( tokenizer *tok )
|
||||||
{
|
{
|
||||||
|
CHECK( tok, 0 );
|
||||||
|
|
||||||
return tok->last_pos + (tok->free_orig?1:0);
|
return tok->last_pos + (tok->free_orig?1:0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void tok_set_pos( tokenizer *tok, int pos )
|
void tok_set_pos( tokenizer *tok, int pos )
|
||||||
{
|
{
|
||||||
|
CHECK( tok, );
|
||||||
|
|
||||||
tok->buff = tok->orig_buff + pos;
|
tok->buff = tok->orig_buff + pos;
|
||||||
tok->has_next = 1;
|
tok->has_next = 1;
|
||||||
tok_next( tok );
|
tok_next( tok );
|
||||||
|
|
Loading…
Reference in a new issue