mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 04:43:10 +00:00
A few more error checks during string to integer conversion in various places
darcs-hash:20070109134117-ac50b-8816e238b0b6aa3fe83c0a4695d719a60b0d17d4.gz
This commit is contained in:
parent
b70092e281
commit
6e71b5a59c
3 changed files with 122 additions and 90 deletions
8
main.c
8
main.c
|
@ -195,8 +195,12 @@ static int fish_parse_opt( int argc, char **argv, char **cmd_ptr )
|
|||
case 'd':
|
||||
{
|
||||
char *end;
|
||||
int tmp = strtol(optarg, &end, 10);
|
||||
if( tmp >= 0 && tmp <=10 && !*end )
|
||||
int tmp;
|
||||
|
||||
errno = 0;
|
||||
tmp = strtol(optarg, &end, 10);
|
||||
|
||||
if( tmp >= 0 && tmp <=10 && !*end && !errno )
|
||||
{
|
||||
debug_level=tmp;
|
||||
}
|
||||
|
|
199
parser.c
199
parser.c
|
@ -112,6 +112,11 @@ The fish parser. Contains functions for parsing and evaluating code.
|
|||
*/
|
||||
#define ILLEGAL_CMD_ERR_MSG _( L"Illegal command name '%ls'")
|
||||
|
||||
/**
|
||||
Error message when encountering an illegal file descriptor
|
||||
*/
|
||||
#define ILLEGAL_FD_ERR_MSG _( L"Illegal file descriptor '%ls'")
|
||||
|
||||
/**
|
||||
Error message for wildcards with no matches
|
||||
*/
|
||||
|
@ -1366,6 +1371,8 @@ static void parse_job_argument_list( process_t *p,
|
|||
{
|
||||
case TOK_PIPE:
|
||||
{
|
||||
wchar_t *end;
|
||||
|
||||
if( (p->type == INTERNAL_EXEC) )
|
||||
{
|
||||
error( SYNTAX_ERROR,
|
||||
|
@ -1373,14 +1380,22 @@ static void parse_job_argument_list( process_t *p,
|
|||
EXEC_ERR_MSG );
|
||||
return;
|
||||
}
|
||||
p->pipe_write_fd = wcstol( tok_last( tok ), 0, 10 );
|
||||
|
||||
errno = 0;
|
||||
p->pipe_write_fd = wcstol( tok_last( tok ), &end, 10 );
|
||||
if( p->pipe_write_fd < 0 || errno || *end )
|
||||
{
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
ILLEGAL_FD_ERR_MSG,
|
||||
tok_last( tok ) );
|
||||
return;
|
||||
}
|
||||
|
||||
if( !p->argv )
|
||||
halloc_register( j, p->argv = list_to_char_arr( args ) );
|
||||
p->next = halloc( j, sizeof( process_t ) );
|
||||
if( p->next == 0 )
|
||||
{
|
||||
DIE_MEM();
|
||||
}
|
||||
|
||||
tok_next( tok );
|
||||
|
||||
/*
|
||||
|
@ -1505,7 +1520,8 @@ static void parse_job_argument_list( process_t *p,
|
|||
int type = tok_last_type( tok );
|
||||
io_data_t *new_io;
|
||||
wchar_t *target = 0;
|
||||
|
||||
wchar_t *end;
|
||||
|
||||
/*
|
||||
Don't check redirections in skipped part
|
||||
|
||||
|
@ -1530,93 +1546,104 @@ static void parse_job_argument_list( process_t *p,
|
|||
if( !new_io )
|
||||
DIE_MEM();
|
||||
|
||||
errno = 0;
|
||||
new_io->fd = wcstol( tok_last( tok ),
|
||||
0,
|
||||
&end,
|
||||
10 );
|
||||
tok_next( tok );
|
||||
|
||||
switch( tok_last_type( tok ) )
|
||||
if( new_io->fd < 0 || errno || *end )
|
||||
{
|
||||
case TOK_STRING:
|
||||
{
|
||||
target = (wchar_t *)expand_one( j, wcsdup( tok_last( tok ) ), 0);
|
||||
|
||||
if( target == 0 && error_code == 0 )
|
||||
{
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
REDIRECT_TOKEN_ERR_MSG,
|
||||
tok_last( tok ) );
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
REDIRECT_TOKEN_ERR_MSG,
|
||||
tok_get_desc( tok_last_type(tok)) );
|
||||
}
|
||||
|
||||
if( target == 0 || wcslen( target )==0 )
|
||||
{
|
||||
if( error_code == 0 )
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
_(L"Invalid IO redirection") );
|
||||
tok_next(tok);
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
ILLEGAL_FD_ERR_MSG,
|
||||
tok_last( tok ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
tok_next( tok );
|
||||
|
||||
|
||||
switch( type )
|
||||
switch( tok_last_type( tok ) )
|
||||
{
|
||||
case TOK_REDIRECT_APPEND:
|
||||
new_io->io_mode = IO_FILE;
|
||||
new_io->param2.flags = O_CREAT | O_APPEND | O_WRONLY;
|
||||
new_io->param1.filename = target;
|
||||
break;
|
||||
|
||||
case TOK_REDIRECT_OUT:
|
||||
new_io->io_mode = IO_FILE;
|
||||
new_io->param2.flags = O_CREAT | O_WRONLY | O_TRUNC;
|
||||
new_io->param1.filename = target;
|
||||
break;
|
||||
|
||||
case TOK_REDIRECT_IN:
|
||||
new_io->io_mode = IO_FILE;
|
||||
new_io->param2.flags = O_RDONLY;
|
||||
new_io->param1.filename = target;
|
||||
break;
|
||||
|
||||
case TOK_REDIRECT_FD:
|
||||
case TOK_STRING:
|
||||
{
|
||||
if( wcscmp( target, L"-" ) == 0 )
|
||||
{
|
||||
new_io->io_mode = IO_CLOSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_io->io_mode = IO_FD;
|
||||
new_io->param1.old_fd = wcstol( target,
|
||||
0,
|
||||
10 );
|
||||
if( ( new_io->param1.old_fd < 0 ) ||
|
||||
( new_io->param1.old_fd > 10 ) )
|
||||
{
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
_(L"Requested redirection to something that is not a file descriptor %ls"),
|
||||
target );
|
||||
target = (wchar_t *)expand_one( j, wcsdup( tok_last( tok ) ), 0);
|
||||
|
||||
if( target == 0 && error_code == 0 )
|
||||
{
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
REDIRECT_TOKEN_ERR_MSG,
|
||||
tok_last( tok ) );
|
||||
|
||||
tok_next(tok);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
REDIRECT_TOKEN_ERR_MSG,
|
||||
tok_get_desc( tok_last_type(tok)) );
|
||||
}
|
||||
|
||||
if( target == 0 || wcslen( target )==0 )
|
||||
{
|
||||
if( error_code == 0 )
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
_(L"Invalid IO redirection") );
|
||||
tok_next(tok);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
switch( type )
|
||||
{
|
||||
case TOK_REDIRECT_APPEND:
|
||||
new_io->io_mode = IO_FILE;
|
||||
new_io->param2.flags = O_CREAT | O_APPEND | O_WRONLY;
|
||||
new_io->param1.filename = target;
|
||||
break;
|
||||
|
||||
case TOK_REDIRECT_OUT:
|
||||
new_io->io_mode = IO_FILE;
|
||||
new_io->param2.flags = O_CREAT | O_WRONLY | O_TRUNC;
|
||||
new_io->param1.filename = target;
|
||||
break;
|
||||
|
||||
case TOK_REDIRECT_IN:
|
||||
new_io->io_mode = IO_FILE;
|
||||
new_io->param2.flags = O_RDONLY;
|
||||
new_io->param1.filename = target;
|
||||
break;
|
||||
|
||||
case TOK_REDIRECT_FD:
|
||||
{
|
||||
if( wcscmp( target, L"-" ) == 0 )
|
||||
{
|
||||
new_io->io_mode = IO_CLOSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_io->io_mode = IO_FD;
|
||||
new_io->param1.old_fd = wcstol( target,
|
||||
0,
|
||||
10 );
|
||||
if( ( new_io->param1.old_fd < 0 ) ||
|
||||
( new_io->param1.old_fd > 10 ) )
|
||||
{
|
||||
error( SYNTAX_ERROR,
|
||||
tok_get_pos( tok ),
|
||||
_(L"Requested redirection to something that is not a file descriptor %ls"),
|
||||
target );
|
||||
|
||||
tok_next(tok);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1677,14 +1704,14 @@ static void parse_job_argument_list( process_t *p,
|
|||
}
|
||||
|
||||
/*
|
||||
static void print_block_stack( block_t *b )
|
||||
{
|
||||
if( !b )
|
||||
return;
|
||||
print_block_stack( b->outer );
|
||||
static void print_block_stack( block_t *b )
|
||||
{
|
||||
if( !b )
|
||||
return;
|
||||
print_block_stack( b->outer );
|
||||
|
||||
debug( 0, L"Block type %ls, skip: %d", parser_get_block_desc( b->type ), b->skip );
|
||||
}
|
||||
debug( 0, L"Block type %ls, skip: %d", parser_get_block_desc( b->type ), b->skip );
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
|
|
|
@ -102,10 +102,11 @@ int translate_color( char *str )
|
|||
|
||||
if( !str )
|
||||
return -1;
|
||||
|
||||
|
||||
errno = 0;
|
||||
color = strtol( str, &endptr, 10 );
|
||||
if(endptr<=str)
|
||||
|
||||
if( *endptr || color<0 || errno )
|
||||
{
|
||||
int i;
|
||||
color = -1;
|
||||
|
|
Loading…
Reference in a new issue