From a76c8de44c8c1f47f4db4cef0e9b1ce2f8c52a31 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Tue, 13 Mar 2012 09:47:01 +0000 Subject: 30351 + 30352: metafy strings on import into zsh variables --- Src/params.c | 34 ++++++++++++++++++---------------- Src/utils.c | 22 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 16 deletions(-) (limited to 'Src') diff --git a/Src/params.c b/Src/params.c index 59d5daf2f..8a0ed5143 100644 --- a/Src/params.c +++ b/Src/params.c @@ -698,16 +698,18 @@ createparamtable(void) * So allow the user to set it in the special cases where it's * useful. */ - setsparam("TMPPREFIX", ztrdup(DEFAULT_TMPPREFIX)); - setsparam("TIMEFMT", ztrdup(DEFAULT_TIMEFMT)); - setsparam("WATCHFMT", ztrdup(default_watchfmt)); + setsparam("TMPPREFIX", ztrdup_metafy(DEFAULT_TMPPREFIX)); + setsparam("TIMEFMT", ztrdup_metafy(DEFAULT_TIMEFMT)); + setsparam("WATCHFMT", ztrdup_metafy(default_watchfmt)); hostnam = (char *)zalloc(256); gethostname(hostnam, 256); - setsparam("HOST", ztrdup(hostnam)); + setsparam("HOST", ztrdup_metafy(hostnam)); zfree(hostnam, 256); - setsparam("LOGNAME", ztrdup((str = getlogin()) && *str ? str : cached_username)); + setsparam("LOGNAME", + ztrdup_metafy((str = getlogin()) && *str ? + str : cached_username)); #if !defined(HAVE_PUTENV) && !defined(USE_SET_UNSET_ENV) /* Copy the environment variables we are inheriting to dynamic * @@ -778,22 +780,22 @@ createparamtable(void) if(uname(&unamebuf)) setsparam("CPUTYPE", ztrdup("unknown")); else { - machinebuf = ztrdup(unamebuf.machine); + machinebuf = ztrdup_metafy(unamebuf.machine); setsparam("CPUTYPE", machinebuf); } - + #else - setsparam("CPUTYPE", ztrdup("unknown")); + setsparam("CPUTYPE", ztrdup_metafy("unknown")); #endif - setsparam("MACHTYPE", ztrdup(MACHTYPE)); - setsparam("OSTYPE", ztrdup(OSTYPE)); - setsparam("TTY", ztrdup(ttystrname)); - setsparam("VENDOR", ztrdup(VENDOR)); - setsparam("ZSH_NAME", ztrdup(zsh_name)); - setsparam("ZSH_VERSION", ztrdup(ZSH_VERSION)); - setsparam("ZSH_PATCHLEVEL", ztrdup(ZSH_PATCHLEVEL)); + setsparam("MACHTYPE", ztrdup_metafy(MACHTYPE)); + setsparam("OSTYPE", ztrdup_metafy(OSTYPE)); + setsparam("TTY", ztrdup_metafy(ttystrname)); + setsparam("VENDOR", ztrdup_metafy(VENDOR)); + setsparam("ZSH_NAME", ztrdup_metafy(zsh_name)); + setsparam("ZSH_VERSION", ztrdup_metafy(ZSH_VERSION)); + setsparam("ZSH_PATCHLEVEL", ztrdup_metafy(ZSH_PATCHLEVEL)); setaparam("signals", sigptr = zalloc((SIGCOUNT+4) * sizeof(char *))); - for (t = sigs; (*sigptr++ = ztrdup(*t++)); ); + for (t = sigs; (*sigptr++ = ztrdup_metafy(*t++)); ); noerrs = 0; } diff --git a/Src/utils.c b/Src/utils.c index f07d8cc31..a9b5c2c58 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -4012,6 +4012,28 @@ metafy(char *buf, int len, int heap) } +/* + * Duplicate a string, metafying it as we go. + * + * Typically, this is used only for strings imported from outside + * zsh, as strings internally are either already metafied or passed + * around with an associated length. + */ +/**/ +mod_export char * +ztrdup_metafy(const char *s) +{ + /* To mimic ztrdup() behaviour */ + if (!s) + return NULL; + /* + * metafy() does lots of different things, so the pointer + * isn't const. Using it with META_DUP should be safe. + */ + return metafy((char *)s, -1, META_DUP); +} + + /* * Take a null-terminated, metafied string in s into a literal * representation by converting in place. The length is in *len -- cgit 1.4.1