diff --git a/common.c b/common.c index 431d4e1af..a28bff46e 100644 --- a/common.c +++ b/common.c @@ -791,7 +791,7 @@ wchar_t *escape( const wchar_t *in, } -wchar_t *unescape( const wchar_t * orig, int unescape_special ) +wchar_t *unescape( const wchar_t * orig, int flags ) { int mode = 0; @@ -800,7 +800,9 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special ) int bracket_count=0; wchar_t prev=0; wchar_t *in; - + int unescape_special = flags & UNESCAPE_SPECIAL; + int allow_incomplete = flags & UNESCAPE_INCOMPLETE; + CHECK( orig, 0 ); len = wcslen( orig ); @@ -1153,6 +1155,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special ) mode = 1; if( unescape_special ) in[out_pos] = INTERNAL_SEPARATOR; + else + out_pos--; break; } @@ -1161,6 +1165,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special ) mode = 2; if( unescape_special ) in[out_pos] = INTERNAL_SEPARATOR; + else + out_pos--; break; } @@ -1209,6 +1215,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special ) { if( unescape_special ) in[out_pos] = INTERNAL_SEPARATOR; + else + out_pos--; mode = 0; } else @@ -1231,6 +1239,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special ) mode = 0; if( unescape_special ) in[out_pos] = INTERNAL_SEPARATOR; + else + out_pos--; break; } @@ -1287,6 +1297,13 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special ) } } } + + if( !allow_incomplete && mode ) + { + free( in ); + return 0; + } + in[out_pos]=L'\0'; return in; } diff --git a/common.h b/common.h index d6559cd0a..af3a723ef 100644 --- a/common.h +++ b/common.h @@ -40,6 +40,10 @@ */ #define BYTE_MAX 0xffu +#define UNESCAPE_SPECIAL 1 +#define UNESCAPE_INCOMPLETE 2 + + /** Save the shell mode on startup so we can restore them on exit */