aboutsummaryrefslogtreecommitdiffhomepage
path: root/highlight.c
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2006-06-21 07:16:21 +1000
committerGravatar axel <axel@liljencrantz.se>2006-06-21 07:16:21 +1000
commit51c6c5ea4944f60aeaf755db4b98462df5e51a45 (patch)
tree2d43f275efcd7472fc648f1972d7699fcec677b6 /highlight.c
parent568803568043345e7971403f03769a485a73939c (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.c125
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 );
+ }
}
- }
+ }
}
}