diff options
author | axel <axel@liljencrantz.se> | 2006-08-01 02:48:16 +1000 |
---|---|---|
committer | axel <axel@liljencrantz.se> | 2006-08-01 02:48:16 +1000 |
commit | bd0c1573df2a0865f03918e4e3027bbb9919af38 (patch) | |
tree | e1f462c4df1e87df77a108d90eed4f3babb78219 /expand.c | |
parent | 2700a9b697bffd971f596dba2c09371ae4c3912c (diff) |
Fix bug when using same array index more than once in a single array expansion, e.g. $PATH[1 1 1]
darcs-hash:20060731164816-ac50b-d3fc56b425035a4cbcf93a91435f9df9ca5997ac.gz
Diffstat (limited to 'expand.c')
-rw-r--r-- | expand.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -892,7 +892,12 @@ static int expand_variables( wchar_t *in, array_list_t *out, int last_idx ) { tmp = al_get_count( &var_item_list)+tmp+1; } - + + /* + Check that we are within array + bounds. If not, truncate the list to + exit. + */ if( tmp < 1 || tmp > al_get_count( &var_item_list ) ) { error( SYNTAX_ERROR, @@ -904,12 +909,11 @@ static int expand_variables( wchar_t *in, array_list_t *out, int last_idx ) } else { - /* Move string from list l to list idx */ - al_set( var_idx_list, j, al_get( &var_item_list, tmp-1 ) ); - al_set( &var_item_list, tmp-1, 0 ); + /* Replace each index in var_idx_list inplace with the string value at the specified index */ + al_set( var_idx_list, j, wcsdup(al_get( &var_item_list, tmp-1 ) ) ); } } - /* Free remaining strings in list l and truncate it */ + /* Free strings in list var_item_list and truncate it */ al_foreach( &var_item_list, &free ); al_truncate( &var_item_list, 0 ); /* Add items from list idx back to list l */ |