about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Src/builtin.c4
-rw-r--r--Src/zsh.h6
3 files changed, 9 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 1ae2b45c6..cf744ba67 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2007-01-04  Peter Stephenson  <pws@csr.com>
 
+	* 23088: Src/builtin.c, Src/zsh.h: Stephane says printf
+	formats and arguments should actually be escaped differently.
+
 	* 20386: Src/zsh.h, Test/B03print.ztst: printf should handle
 	octal escapes in the '\0NNN' form.
 
diff --git a/Src/builtin.c b/Src/builtin.c
index d756b28bb..8e579d24e 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3490,7 +3490,7 @@ bin_print(char *name, char **args, Options ops, int func)
 	fmt = OPT_ARG(ops,'f');
     if (fmt)
 	fmt = getkeystring(fmt, &flen, OPT_ISSET(ops,'b') ? GETKEYS_BINDKEY :
-			   GETKEYS_PRINTF, &fmttrunc);
+			   GETKEYS_PRINTF_FMT, &fmttrunc);
 
     first = args;
     
@@ -3954,7 +3954,7 @@ bin_print(char *name, char **args, Options ops, int func)
 			b = getkeystring(metafy(curarg, curlen, META_USEHEAP),
 					 &l,
 					 OPT_ISSET(ops,'b') ? GETKEYS_BINDKEY :
-					 GETKEYS_PRINTF, &nnl);
+					 GETKEYS_PRINTF_ARG, &nnl);
 		    } else {
 			b = curarg;
 			l = curlen;
diff --git a/Src/zsh.h b/Src/zsh.h
index 48f50e6a1..752587c57 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1990,8 +1990,10 @@ enum {
  */
 /* echo builtin */
 #define GETKEYS_ECHO	(GETKEY_BACKSLASH_C)
-/* printf format string */
-#define GETKEYS_PRINTF	(GETKEY_BACKSLASH_C)
+/* printf format string:  \123 -> S, \0123 -> NL 3 */
+#define GETKEYS_PRINTF_FMT	(GETKEY_OCTAL_ESC|GETKEY_BACKSLASH_C)
+/* printf argument:  \123 -> \123, \0123 -> S */
+#define GETKEYS_PRINTF_ARG	(GETKEY_BACKSLASH_C)
 /* Full print without -e */
 #define GETKEYS_PRINT	(GETKEY_OCTAL_ESC|GETKEY_BACKSLASH_C|GETKEY_EMACS)
 /* bindkey */