diff options
author | Peter Stephenson <pws@zsh.org> | 2014-09-29 17:15:21 +0100 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2014-09-29 17:15:56 +0100 |
commit | 546203a770cec329e73781c3c8ab1078390aee72 (patch) | |
tree | 7414723b23c4d421af3fb67e56f6435e1a8fb010 | |
parent | 7cabee52d8132fed31767392540ae67bac36377e (diff) | |
download | zsh-546203a770cec329e73781c3c8ab1078390aee72.tar.gz zsh-546203a770cec329e73781c3c8ab1078390aee72.tar.xz zsh-546203a770cec329e73781c3c8ab1078390aee72.zip |
33276: safer import of numerical variables from environment
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/params.c | 39 | ||||
-rw-r--r-- | Src/zsh.h | 3 |
3 files changed, 38 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog index b89f90015..dba06e479 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2014-09-29 Peter Stephenson <p.stephenson@samsung.com> + + * 33276: Src/params.c, Src/zsh.h: safer import of numerical + variables from environment. + 2014-09-27 Barton E. Schaefer <schaefer@zsh.org> * 33256: Src/prompt.c: fix prompttrunc() counting of %{ %} spans diff --git a/Src/params.c b/Src/params.c index 0699ead85..61edc5d08 100644 --- a/Src/params.c +++ b/Src/params.c @@ -46,7 +46,7 @@ /**/ mod_export int locallevel; - + /* Variables holding values of special parameters */ /**/ @@ -325,9 +325,12 @@ IPDEF4("ZSH_SUBSHELL", &zsh_subshell), IPDEF5("COLUMNS", &zterm_columns, zlevar_gsu), IPDEF5("LINES", &zterm_lines, zlevar_gsu), IPDEF5U("ZLE_RPROMPT_INDENT", &rprompt_indent, zlevar_gsu), -IPDEF5("OPTIND", &zoptind, varinteger_gsu), IPDEF5("SHLVL", &shlvl, varinteger_gsu), -IPDEF5("TRY_BLOCK_ERROR", &try_errflag, varinteger_gsu), + +/* Don't import internal integer status variables. */ +#define IPDEF6(A,B,F) {{NULL,A,PM_INTEGER|PM_SPECIAL|PM_DONTIMPORT},BR((void *)B),GSU(F),10,0,NULL,NULL,NULL,0} +IPDEF6("OPTIND", &zoptind, varinteger_gsu), +IPDEF6("TRY_BLOCK_ERROR", &try_errflag, varinteger_gsu), #define IPDEF7(A,B) {{NULL,A,PM_SCALAR|PM_SPECIAL},BR((void *)B),GSU(varscalar_gsu),0,0,NULL,NULL,NULL,0} #define IPDEF7U(A,B) {{NULL,A,PM_SCALAR|PM_SPECIAL|PM_UNSET},BR((void *)B),GSU(varscalar_gsu),0,0,NULL,NULL,NULL,0} @@ -742,7 +745,8 @@ createparamtable(void) if (!idigit(*iname) && isident(iname) && !strchr(iname, '[')) { if ((!(pm = (Param) paramtab->getnode(paramtab, iname)) || !(pm->node.flags & PM_DONTIMPORT || pm->node.flags & PM_EXPORTED)) && - (pm = setsparam(iname, metafy(ivalue, -1, META_DUP)))) { + (pm = assignsparam(iname, metafy(ivalue, -1, META_DUP), + ASSPM_ENV_IMPORT))) { pm->node.flags |= PM_EXPORTED; if (pm->node.flags & PM_SPECIAL) pm->env = mkenvstr (pm->node.nam, @@ -2271,6 +2275,13 @@ export_param(Param pm) mod_export void setstrvalue(Value v, char *val) { + assignstrvalue(v, val, 0); +} + +/**/ +mod_export void +assignstrvalue(Value v, char *val, int flags) +{ if (unset(EXECOPT)) return; if (v->pm->node.flags & PM_READONLY) { @@ -2347,7 +2358,13 @@ setstrvalue(Value v, char *val) break; case PM_INTEGER: if (val) { - v->pm->gsu.i->setfn(v->pm, mathevali(val)); + zlong ival; + if (flags & ASSPM_ENV_IMPORT) { + char *ptr; + ival = zstrtol_underscore(val, &ptr, 0, 1); + } else + ival = mathevali(val); + v->pm->gsu.i->setfn(v->pm, ival); if ((v->pm->node.flags & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) && !v->pm->width) v->pm->width = strlen(val); @@ -2359,7 +2376,13 @@ setstrvalue(Value v, char *val) case PM_EFLOAT: case PM_FFLOAT: if (val) { - mnumber mn = matheval(val); + mnumber mn; + if (flags & ASSPM_ENV_IMPORT) { + char *ptr; + mn.type = MN_FLOAT; + mn.u.d = strtod(val, &ptr); + } else + mn = matheval(val); v->pm->gsu.f->setfn(v->pm, (mn.type & MN_FLOAT) ? mn.u.d : (double)mn.u.l); if ((v->pm->node.flags & (PM_LEFT | PM_RIGHT_B | PM_RIGHT_Z)) && @@ -2742,8 +2765,8 @@ assignsparam(char *s, char *val, int flags) } } } - - setstrvalue(v, val); + + assignstrvalue(v, val, flags); unqueue_signals(); return v->pm; } diff --git a/Src/zsh.h b/Src/zsh.h index fa7396112..8f56fa265 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -1820,7 +1820,8 @@ struct paramdef { */ enum { ASSPM_AUGMENT = 1 << 0, - ASSPM_WARN_CREATE = 1 << 1 + ASSPM_WARN_CREATE = 1 << 1, + ASSPM_ENV_IMPORT = 1 << 2 }; /* node for named directory hash table (nameddirtab) */ |