From e2e7277392a6fe556e5904eeae5b6d83bf300779 Mon Sep 17 00:00:00 2001 From: "Steffen (Daode) Nurpmeso" Date: Fri, 17 Jun 2016 15:07:37 +0200 Subject: [PATCH] Add automatism to reject control characters.. in the value of accordingly flagge variables. --- accmacvar.c | 46 ++++++++++++++++++++++++++++++++++++++-------- mk-okey-map.pl | 18 +++++++++++------- nail.h | 8 ++++---- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/accmacvar.c b/accmacvar.c index a1a00a59..caff9671 100644 --- a/accmacvar.c +++ b/accmacvar.c @@ -78,13 +78,14 @@ enum a_amv_var_flags{ a_AMV_VF_RDONLY = 1<<2, /* May not be set by user */ a_AMV_VF_NODEL = 1<<3, /* May not be deleted */ a_AMV_VF_NOTEMPTY = 1<<4, /* May not be assigned an empty value */ - a_AMV_VF_VIP = 1<<5, /* Wants _var_check_vips() evaluation */ - a_AMV_VF_IMPORT = 1<<6, /* Import ONLY from environ (before PS_STARTED) */ - a_AMV_VF_ENV = 1<<7, /* Update environment on change */ - a_AMV_VF_I3VAL = 1<<8, /* Has an initial value */ - a_AMV_VF_DEFVAL = 1<<9, /* Has a default value */ - a_AMV_VF_LINKED = 1<<10, /* `environ' linked */ - a_AMV_VF__MASK = (1<<(10+1)) - 1 + a_AMV_VF_NOCNTRLS = 1<<5, /* Value may not contain control characters */ + a_AMV_VF_VIP = 1<<6, /* Wants _var_check_vips() evaluation */ + a_AMV_VF_IMPORT = 1<<7, /* Import ONLY from environ (before PS_STARTED) */ + a_AMV_VF_ENV = 1<<8, /* Update environment on change */ + a_AMV_VF_I3VAL = 1<<9, /* Has an initial value */ + a_AMV_VF_DEFVAL = 1<<10, /* Has a default value */ + a_AMV_VF_LINKED = 1<<11, /* `environ' linked */ + a_AMV_VF__MASK = (1<<(11+1)) - 1 }; struct a_amv_mac{ @@ -833,6 +834,22 @@ a_amv_var_lookup(struct a_amv_var_carrier *avcp){ if(isempty){ if(!isbltin) goto jerr; + }else{ + if(avmp->avm_flags & a_AMV_VF_NOCNTRLS){ + for(i = 0;; ++i){ + char c = cp[i]; + + if(c == '\0') + break; + if(cntrlchar(c)){ + if(options & OPT_D_V) + n_err(_("Ignoring environment, control characters " + "invalid in variable: \"%s\"\n"), + avcp->avc_name); + goto jerr; + } + } + } } goto jnewval; } @@ -893,8 +910,9 @@ jleave: jnewval: /* C99 */{ struct a_amv_var **avpp; - size_t l = strlen(avcp->avc_name) +1; + size_t l; + l = strlen(avcp->avc_name) +1; avcp->avc_var = avp = smalloc(sizeof(*avp) - VFIELD_SIZEOF(struct a_amv_var, av_name) + l); avp->av_link = *(avpp = &a_amv_vars[avcp->avc_prime]); @@ -942,6 +960,16 @@ a_amv_var_set(struct a_amv_var_carrier *avcp, char const *value, n_err(_("Variable must not be empty: \"%s\"\n"), avcp->avc_name); goto jleave; } + if(UNLIKELY((avmp->avm_flags & a_AMV_VF_NOCNTRLS) != 0)){ + char const *cp; + + for(cp = value; *cp != '\0'; ++cp) + if(cntrlchar(*cp)){ + n_err(_("Control characters invalid in variable: \"%s\"\n"), + avcp->avc_name); + goto jleave; + } + } if(UNLIKELY((avmp->avm_flags & a_AMV_VF_IMPORT) != 0 && !(pstate & (PS_ROOT | PS_STARTED)))){ n_err(_("Variable cannot be set in a resource file: \"%s\"\n"), @@ -1210,6 +1238,8 @@ a_amv_var_show(char const *name, FILE *fp, struct n_string *msgp){ {a_AMV_VF_VIRT, "virtual"}, {a_AMV_VF_RDONLY, "readonly"}, {a_AMV_VF_NODEL, "nodelete"}, + {a_AMV_VF_NOTEMPTY, "notempty"}, + {a_AMV_VF_NOCNTRLS, "no-control-chars"}, {a_AMV_VF_IMPORT, "import-environ-first\0"}, {a_AMV_VF_ENV, "sync-environ"}, {a_AMV_VF_I3VAL, "initial-value"}, diff --git a/mk-okey-map.pl b/mk-okey-map.pl index 4f00c719..cd8f3b2c 100755 --- a/mk-okey-map.pl +++ b/mk-okey-map.pl @@ -76,6 +76,7 @@ sub parse_nail_h{ die "Unsupported special directive: $1" if($1 ne 'name' && $1 ne 'rdonly' && $1 ne 'nodel' && $1 ne 'notempty' && + $1 ne 'nocntrls' && $1 ne 'vip' && $1 ne 'virt' && $1 ne 'env' && $1 ne 'import' && $1 ne 'i3val' && $1 ne 'defval'); @@ -118,13 +119,14 @@ enum a_amv_var_flags{ a_AMV_VF_RDONLY = 1<<2, /* May not be set by user */ a_AMV_VF_NODEL = 1<<3, /* May not be deleted */ a_AMV_VF_NOTEMPTY = 1<<4, /* May not be assigned an empty value */ - a_AMV_VF_VIP = 1<<5, /* Wants _var_check_vips() evaluation */ - a_AMV_VF_IMPORT = 1<<6, /* Import ONLY from environ (before PS_STARTED) */ - a_AMV_VF_ENV = 1<<7, /* Update environment on change */ - a_AMV_VF_I3VAL = 1<<8, /* Has an initial value */ - a_AMV_VF_DEFVAL = 1<<9, /* Has a default value */ - a_AMV_VF_LINKED = 1<<10, /* `environ' linked */ - a_AMV_VF__MASK = (1<<(10+1)) - 1 + a_AMV_VF_NOCNTRLS = 1<<5, /* Value may not contain control characters */ + a_AMV_VF_VIP = 1<<6, /* Wants _var_check_vips() evaluation */ + a_AMV_VF_IMPORT = 1<<7, /* Import ONLY from environ (before PS_STARTED) */ + a_AMV_VF_ENV = 1<<8, /* Update environment on change */ + a_AMV_VF_I3VAL = 1<<9, /* Has an initial value */ + a_AMV_VF_DEFVAL = 1<<10, /* Has a default value */ + a_AMV_VF_LINKED = 1<<11, /* `environ' linked */ + a_AMV_VF__MASK = (1<<(11+1)) - 1 }; struct a_amv_var_map{ @@ -285,6 +287,7 @@ sub dump_map{ if($e->{rdonly}) {$f .= $s . 'a_AMV_VF_RDONLY'; $s = '|'} if($e->{nodel}) {$f .= $s . 'a_AMV_VF_NODEL'; $s = '|'} if($e->{notempty}) {$f .= $s . 'a_AMV_VF_NOTEMPTY'; $s = '|'} + if($e->{nocntrls}) {$f .= $s . 'a_AMV_VF_NOCNTRLS'; $s = '|'} if($e->{vip}) {$f .= $s . 'a_AMV_VF_VIP'; $s = '|'} if($e->{env}) {$f .= $s . 'a_AMV_VF_ENV'; $s = '|'} print F "${S}/* $i. [$alen]+$l $k$f */\n" if $VERB; @@ -303,6 +306,7 @@ sub dump_map{ $f .= '|a_AMV_VF_RDONLY' if $e->{rdonly}; $f .= '|a_AMV_VF_NODEL' if $e->{nodel}; $f .= '|a_AMV_VF_NOTEMPTY' if $e->{notempty}; + $f .= '|a_AMV_VF_NOCNTRLS' if $e->{nocntrls}; $f .= '|a_AMV_VF_VIP' if $e->{vip}; $f .= '|a_AMV_VF_IMPORT' if $e->{import}; $f .= '|a_AMV_VF_ENV' if $e->{env}; diff --git a/nail.h b/nail.h index 37c432e4..e64aa909 100644 --- a/nail.h +++ b/nail.h @@ -1346,7 +1346,7 @@ ok_b_autothread, ok_b_colour_disable, ok_b_colour_pager, ok_v_crt, - ok_v_customhdr, + ok_v_customhdr, /* {nocntrls=1} */ ok_v_DEAD, /* {env=1,defval=VAL_DEAD} */ ok_v_datefield, @@ -1430,8 +1430,8 @@ ok_v_NAIL_TAIL, /* {name=NAIL_TAIL} */ ok_b_outfolder, - ok_v_PAGER, /* {env=1,defval=VAL_PAGER} */ - ok_v_PATH, /* {nodel=1,import=1} */ + ok_v_PAGER, /* {env=1,defval=VAL_PAGER} */ + ok_v_PATH, /* {nodel=1,import=1} */ ok_b_page, ok_v_password, ok_b_piperaw, @@ -1441,7 +1441,7 @@ ok_v_NAIL_TAIL, /* {name=NAIL_TAIL} */ ok_b_pop3_no_apop, ok_b_pop3_use_starttls, ok_b_print_alternatives, - ok_v_prompt, /* {i3val="\\& "} */ + ok_v_prompt, /* {i3val="\\& "} */ ok_b_quiet, ok_v_quote, -- 2.11.4.GIT