summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2012-03-13 09:47:01 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2012-03-13 09:47:01 +0000
commita76c8de44c8c1f47f4db4cef0e9b1ce2f8c52a31 (patch)
treee3be887d4462f8496155de34048955a97933c878
parentafa112474c981941ad95ef82cbe75479556ed23a (diff)
downloadzsh-a76c8de44c8c1f47f4db4cef0e9b1ce2f8c52a31.tar.gz
zsh-a76c8de44c8c1f47f4db4cef0e9b1ce2f8c52a31.zip
30351 + 30352: metafy strings on import into zsh variables
-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