diff options
author | 2006-06-21 07:16:21 +1000 | |
---|---|---|
committer | 2006-06-21 07:16:21 +1000 | |
commit | 51c6c5ea4944f60aeaf755db4b98462df5e51a45 (patch) | |
tree | 2d43f275efcd7472fc648f1972d7699fcec677b6 /highlight.c | |
parent | 568803568043345e7971403f03769a485a73939c (diff) |
Make sure failed tilde expansion doesn't result in evaluating null strings in highlighting code
darcs-hash:20060620211621-ac50b-3d57cc28272f5222fb42a72f0f98f89af1ec60de.gz
Diffstat (limited to 'highlight.c')
-rw-r--r-- | highlight.c | 125 |
1 files changed, 64 insertions, 61 deletions
diff --git a/highlight.c b/highlight.c index 25d58bea..86c0623d 100644 --- a/highlight.c +++ b/highlight.c @@ -80,87 +80,90 @@ static int is_potential_path( const wchar_t *path ) void *context = halloc( 0, 0 ); tilde = expand_tilde( wcsdup(path) ); - halloc_register( context, tilde ); - - unescaped = unescape( tilde, 1 ); - if( unescaped ) + if( tilde ) { - -// debug( 1, L"%ls -> %ls ->%ls", path, tilde, unescaped ); + halloc_register( context, tilde ); - halloc_register( context, unescaped ); - - for( in = out = unescaped; *in; in++ ) + unescaped = unescape( tilde, 1 ); + if( unescaped ) { - switch( *in ) + +// debug( 1, L"%ls -> %ls ->%ls", path, tilde, unescaped ); + + halloc_register( context, unescaped ); + + for( in = out = unescaped; *in; in++ ) { - case PROCESS_EXPAND: - case VARIABLE_EXPAND: - case VARIABLE_EXPAND_SINGLE: - case BRACKET_BEGIN: - case BRACKET_END: - case BRACKET_SEP: + switch( *in ) { - has_magic = 1; - break; - } + case PROCESS_EXPAND: + case VARIABLE_EXPAND: + case VARIABLE_EXPAND_SINGLE: + case BRACKET_BEGIN: + case BRACKET_END: + case BRACKET_SEP: + { + has_magic = 1; + break; + } - case INTERNAL_SEPARATOR: - { - break; - } + case INTERNAL_SEPARATOR: + { + break; + } - default: - { - *(out++) = *in; - break; - } + default: + { + *(out++) = *in; + break; + } - } + } - } - *out = 0; - - if( !has_magic && wcslen( unescaped ) ) - { - int must_be_dir = 0; - DIR *dir; - must_be_dir = unescaped[wcslen(unescaped)-1] == L'/'; - if( must_be_dir ) - { - dir = wopendir( unescaped ); - res = !!dir; - closedir( dir ); } - else + *out = 0; + + if( !has_magic && wcslen( unescaped ) ) { - wchar_t *dir_name, *base; - struct wdirent *ent; - - dir_name = wdirname( halloc_wcsdup(context, unescaped) ); - base = wbasename( halloc_wcsdup(context, unescaped) ); - - if( (wcscmp( dir_name, L"/" ) == 0 ) && - (wcscmp( base, L"/" ) == 0 ) ) + int must_be_dir = 0; + DIR *dir; + must_be_dir = unescaped[wcslen(unescaped)-1] == L'/'; + if( must_be_dir ) { - res = 1; + dir = wopendir( unescaped ); + res = !!dir; + closedir( dir ); } - else if( (dir = wopendir( dir_name )) ) + else { - - while( (ent = wreaddir( dir )) ) + wchar_t *dir_name, *base; + struct wdirent *ent; + + dir_name = wdirname( halloc_wcsdup(context, unescaped) ); + base = wbasename( halloc_wcsdup(context, unescaped) ); + + if( (wcscmp( dir_name, L"/" ) == 0 ) && + (wcscmp( base, L"/" ) == 0 ) ) { - if( wcsncmp( ent->d_name, base, wcslen(base) ) == 0 ) + res = 1; + } + else if( (dir = wopendir( dir_name )) ) + { + + while( (ent = wreaddir( dir )) ) { - res = 1; - break; + if( wcsncmp( ent->d_name, base, wcslen(base) ) == 0 ) + { + res = 1; + break; + } } - } - closedir( dir ); + closedir( dir ); + } } - } + } } } |