ash: document where we accept invalid syntax. no code changes
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 4 Oct 2009 01:14:41 +0000 (03:14 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 4 Oct 2009 01:14:41 +0000 (03:14 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 444a6961b4ae88ec266a374953b187ca4b721a1e..9f1f8a4de981a78ef238b9435438c145f80fe200 100644 (file)
@@ -6371,6 +6371,16 @@ subevalvar(char *p, char *str, int strloc, int subtype,
 
 /*
  * Add the value of a specialized variable to the stack string.
+ * name parameter (examples):
+ * ash -c 'echo $1'      name:'1='
+ * ash -c 'echo $qwe'    name:'qwe='
+ * ash -c 'echo $$'      name:'$='
+ * ash -c 'echo ${$}'    name:'$='
+ * ash -c 'echo ${$##q}' name:'$=q'
+ * ash -c 'echo ${#$}'   name:'$='
+ * note: examples with bad shell syntax:
+ * ash -c 'echo ${#$1}'  name:'$=1'
+ * ash -c 'echo ${#1#}'  name:'1=#'
  */
 static ssize_t
 varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
@@ -6407,7 +6417,7 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
                        return -1;
  numvar:
                len = cvtnum(num);
-               break;
+               goto check_1char_name;
        case '-':
                expdest = makestrspace(NOPTS, expdest);
                for (i = NOPTS - 1; i >= 0; i--) {
@@ -6416,6 +6426,12 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list)
                                len++;
                        }
                }
+ check_1char_name:
+#if 0
+               /* handles cases similar to ${#$1} */
+               if (name[2] != '\0')
+                       raise_error_syntax("bad substitution");
+#endif
                break;
        case '@':
                if (sep)