about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Src/params.c34
-rw-r--r--Src/utils.c22
3 files changed, 47 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index f40bdee55..e1e163fdf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-03-13  Peter Stephenson  <pws@csr.com>
+
+	* 30351 changed as in 30352: Src/params.c, Src/utils.c: metafy
+	scalar and array parameter values as they are imported from
+	strings defined outside zsh.
+
 2012-03-07  Peter Stephenson  <pws@csr.com>
 
 	* users/16865: Doc/Zsh/cond.yo: note that -eq and friends are
@@ -16094,5 +16100,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5607 $
+* $Revision: 1.5608 $
 *****************************************************
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
@@ -4013,6 +4013,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
  * len is non-NULL; if len is NULL, you don't know the length of