svn commit: r194516 - head/bin/sh

Jilles Tjoelker jilles at FreeBSD.org
Fri Jun 19 22:09:56 UTC 2009


Author: jilles
Date: Fri Jun 19 22:09:55 2009
New Revision: 194516
URL: http://svn.freebsd.org/changeset/base/194516

Log:
  Fix some issues with quoted output and shorten it in some cases.
  
  Output quoted suitable for re-input to the shell occurs in
  various cases such as 'set', 'trap'.
  
  Bugfix: *, ? and [ must be quoted (except sole [)
  Bugfix: ~ and # must be quoted (really only sometimes, but keep it simple)
  Bugfix: space, tab and newline must always be quoted
  Shortening: other IFS characters do not need quoting
  Bugfix: send to correct output file, not hard-coded stdout
  Shortening: avoid unnecessary '' with \'
  
  Approved by:	ed (mentor)

Modified:
  head/bin/sh/output.c

Modified: head/bin/sh/output.c
==============================================================================
--- head/bin/sh/output.c	Fri Jun 19 21:14:39 2009	(r194515)
+++ head/bin/sh/output.c	Fri Jun 19 22:09:55 2009	(r194516)
@@ -133,32 +133,38 @@ void
 outqstr(const char *p, struct output *file)
 {
 	char ch;
+	int inquotes;
 
 	if (p[0] == '\0') {
 		outstr("''", file);
 		return;
 	}
-	if (p[strcspn(p, "|&;<>()$`\\\"'")] == '\0' && (!ifsset() ||
-	    p[strcspn(p, ifsval())] == '\0')) {
+	/* Caller will handle '=' if necessary */
+	if (p[strcspn(p, "|&;<>()$`\\\"' \t\n*?[~#")] == '\0' ||
+			strcmp(p, "[") == 0) {
 		outstr(p, file);
 		return;
 	}
 
-	out1c('\'');
+	inquotes = 0;
 	while ((ch = *p++) != '\0') {
 		switch (ch) {
 		case '\'':
-			/*
-			 * Can't quote single quotes inside single quotes;
-			 * close them, write escaped single quote, open again.
-			 */
-			outstr("'\\''", file);
+			/* Can't quote single quotes inside single quotes. */
+			if (inquotes)
+				outc('\'', file);
+			inquotes = 0;
+			outstr("\\'", file);
 			break;
 		default:
+			if (!inquotes)
+				outc('\'', file);
+			inquotes = 1;
 			outc(ch, file);
 		}
 	}
-	out1c('\'');
+	if (inquotes)
+		outc('\'', file);
 }
 
 STATIC char out_junk[16];


More information about the svn-src-head mailing list