diff options
author | Anton Babushkin <anton.babushkin@me.com> | 2014-01-10 12:26:32 +0100 |
---|---|---|
committer | Anton Babushkin <anton.babushkin@me.com> | 2014-01-10 12:26:32 +0100 |
commit | 0539c9579ebcd4c5262a3064dd4a7c8a291d0113 (patch) | |
tree | b2a1c0c3eab7c8140c08297da7d870483a5ef06f /apps | |
parent | 43001e69766ccd50d011ffbf015c925d045ec483 (diff) | |
download | px4-nuttx-0539c9579ebcd4c5262a3064dd4a7c8a291d0113.tar.gz px4-nuttx-0539c9579ebcd4c5262a3064dd4a7c8a291d0113.tar.bz2 px4-nuttx-0539c9579ebcd4c5262a3064dd4a7c8a291d0113.zip |
nsh: fixed syntax checking in env variables expanding
Diffstat (limited to 'apps')
-rw-r--r-- | apps/nshlib/nsh_parse.c | 122 |
1 files changed, 59 insertions, 63 deletions
diff --git a/apps/nshlib/nsh_parse.c b/apps/nshlib/nsh_parse.c index 5151cb369..b00d5dc8c 100644 --- a/apps/nshlib/nsh_parse.c +++ b/apps/nshlib/nsh_parse.c @@ -488,7 +488,9 @@ const char g_fmtinternalerror[] = "nsh: %s: Internal error\n"; #ifndef CONFIG_DISABLE_SIGNALS const char g_fmtsignalrecvd[] = "nsh: %s: Interrupted by signal\n"; #endif - +#ifndef CONFIG_DISABLE_ENVIRON +const char g_fmtbadsubstitution[] = "nsh: %s: bad substitution\n"; +#endif /**************************************************************************** * Private Functions ****************************************************************************/ @@ -1313,40 +1315,40 @@ int nsh_parse(FAR struct nsh_vtbl_s *vtbl, char *cmdline) /* Valid variable char */ continue; } else { - /* Not valid variable char */ - if (src_ptr - var_name_start == 1) { - /* Empty, it was not a variable */ - res_size++; - var_name_start = NULL; - } else { - /* End of variable name */ - if (bracket == (c != '}')) { - /* Bad substitution */ - goto errout; - } - do_expand = true; - var_name_end = src_ptr - 1; - char tmp_char = *var_name_end; - *var_name_end = '\0'; - char *var_value = getenv(var_name_start); - *var_name_end = tmp_char; - res_size += strlen(var_value); - var_name_start = NULL; - if (c == '}') { - bracket = false; - continue; - } + /* End of variable name */ + if (bracket && c != '}') { + /* Bad substitution */ + cmdline[strlen(cmdline) - 1] = '\0'; + nsh_output(vtbl, g_fmtbadsubstitution, cmdline); + goto errout; + } + do_expand = true; + var_name_end = src_ptr - 1; + char tmp_char = *var_name_end; + *var_name_end = '\0'; + char *var_value = getenv(var_name_start); + *var_name_end = tmp_char; + res_size += strlen(var_value); + var_name_start = NULL; + if (c == '}') { + bracket = false; + continue; } } } if (c == '$') { - /* Start parsing variable */ - if (*src_ptr == '{') { + /* Start parsing variable, check next char */ + char nc = *src_ptr; + if (nc == '{') { bracket = true; src_ptr++; + var_name_start = src_ptr; + continue; + } else if ((nc >= 'a' && nc <= 'z') || (nc >= 'A' && nc <= 'Z')) { + /* First variable name char must be letter */ + var_name_start = src_ptr; + continue; } - var_name_start = src_ptr; - continue; } /* Normal char */ res_size++; @@ -1364,6 +1366,7 @@ int nsh_parse(FAR struct nsh_vtbl_s *vtbl, char *cmdline) src_ptr = cmdline; char *res_ptr = cmdline_exp; var_name_start = NULL; + bracket = false; while (true) { char c = *src_ptr++; @@ -1373,49 +1376,42 @@ int nsh_parse(FAR struct nsh_vtbl_s *vtbl, char *cmdline) /* Valid variable char */ continue; } else { - /* Not valid variable char */ - if (src_ptr - var_name_start == 1) { - /* Empty, it was not a variable */ - *res_ptr++ = *(src_ptr - 1); - var_name_start = NULL; - } else { - /* End of variable name */ - if (bracket == (c != '}')) { - /* Bad substitution */ - goto errout; - } - do_expand = true; - var_name_end = src_ptr - 1; - char tmp_char = *var_name_end; - *var_name_end = '\0'; - char *var_value = getenv(var_name_start); - printf("VAR: %s = %s\n", var_name_start, var_value); - *var_name_end = tmp_char; - //res_ptr = stpcpy(res_ptr, var_value); - if (var_value) { - for (int i = 0; true; i++) { - char a = var_value[i]; - if (a == '\0') - break; - *res_ptr++ = a; - } - } - var_name_start = NULL; - if (c == '}') { - bracket = false; - continue; + /* End of variable name, don't check syntax, it's already done on first pass */ + var_name_end = src_ptr - 1; + char tmp_char = *var_name_end; + *var_name_end = '\0'; + char *var_value = getenv(var_name_start); + printf("VAR: %s = %s\n", var_name_start, var_value); + *var_name_end = tmp_char; + //res_ptr = stpcpy(res_ptr, var_value); + if (var_value) { + for (int i = 0; true; i++) { + char a = var_value[i]; + if (a == '\0') + break; + *res_ptr++ = a; } } + var_name_start = NULL; + if (c == '}') { + bracket = false; + continue; + } } } if (c == '$') { - /* Start parsing variable */ - if (*src_ptr == '{') { + /* Start parsing variable, check next char */ + char nc = *src_ptr; + if (nc == '{') { bracket = true; src_ptr++; + var_name_start = src_ptr; + continue; + } else if ((nc >= 'a' && nc <= 'z') || (nc >= 'A' && nc <= 'Z')) { + /* First variable name char must be letter */ + var_name_start = src_ptr; + continue; } - var_name_start = src_ptr; - continue; } /* Normal char */ *res_ptr++ = c; |