From: Todd C. Miller Date: Wed, 8 Oct 2008 18:27:35 +0000 (+0000) Subject: In fill_cmnd(), collapse any escaped sudo-specific characters. X-Git-Tag: SUDO_1_7_0~77 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=240339c051d993e35ec17fa0d4f9c512e8dcf99c;p=sudo In fill_cmnd(), collapse any escaped sudo-specific characters. Allows character classes to be used in pathnames. --- diff --git a/toke.c b/toke.c index 0655a6167..03541b351 100644 --- a/toke.c +++ b/toke.c @@ -3111,21 +3111,33 @@ append(src, len) return(_fill(src, len, olen)); } +#define SPECIAL(c) \ + ((c) == ',' || (c) == ':' || (c) == '=' || (c) == ' ' || (c) == '\t' || (c) == '#') + static int -fill_cmnd(s, len) - char *s; +fill_cmnd(src, len) + char *src; int len; { + char *dst; + int i; + arg_len = arg_size = 0; - yylval.command.cmnd = (char *) malloc(++len); + dst = yylval.command.cmnd = (char *) malloc(++len); if (yylval.command.cmnd == NULL) { yyerror("unable to allocate memory"); return(FALSE); } - /* copy the string and NULL-terminate it (escapes handled by fnmatch) */ - (void) strlcpy(yylval.command.cmnd, s, len); + /* Copy the string and collapse any escaped sudo-specific characters. */ + for (i = 0; i < len; i++) { + if (src[i] == '\\' && i != len - 1 && SPECIAL(src[i + 1])) + *dst++ = src[++i]; + else + *dst++ = src[i]; + } + *dst = '\0'; yylval.command.args = NULL; return(TRUE); diff --git a/toke.l b/toke.l index fb026c8e3..353ab2d11 100644 --- a/toke.l +++ b/toke.l @@ -530,21 +530,33 @@ append(src, len) return(_fill(src, len, olen)); } +#define SPECIAL(c) \ + ((c) == ',' || (c) == ':' || (c) == '=' || (c) == ' ' || (c) == '\t' || (c) == '#') + static int -fill_cmnd(s, len) - char *s; +fill_cmnd(src, len) + char *src; int len; { + char *dst; + int i; + arg_len = arg_size = 0; - yylval.command.cmnd = (char *) malloc(++len); + dst = yylval.command.cmnd = (char *) malloc(++len); if (yylval.command.cmnd == NULL) { yyerror("unable to allocate memory"); return(FALSE); } - /* copy the string and NULL-terminate it (escapes handled by fnmatch) */ - (void) strlcpy(yylval.command.cmnd, s, len); + /* Copy the string and collapse any escaped sudo-specific characters. */ + for (i = 0; i < len; i++) { + if (src[i] == '\\' && i != len - 1 && SPECIAL(src[i + 1])) + *dst++ = src[++i]; + else + *dst++ = src[i]; + } + *dst = '\0'; yylval.command.args = NULL; return(TRUE);