• R/O
  • SSH
  • HTTPS

yash: Commit


Commit MetaInfo

Revision3900 (tree)
Time2018-09-30 23:05:09
Authormagicant

Log Message

Reject IO_NUMBER as redirection operand (#38594)

POSIX requires the redirection operand to be a WORD, not IO_NUMBER.

Such an IO_NUMBER is rejected only in the POSIXly-correct mode because
it does not actually make sense to reject it. It can only be parsed as a
redirection operand anyway.

Change Summary

Incremental Difference

--- yash/trunk/NEWS (revision 3899)
+++ yash/trunk/NEWS (revision 3900)
@@ -24,6 +24,8 @@
2424 * An invalid semicolon that appears at the beginning of a line as a
2525 result of alias substitution in a for loop is now correctly
2626 rejected.
27+ * For strict POSIXly-correctness, an IO_NUMBER token can no longer
28+ be the operand of a redirection.
2729 . Updated the sample initialization script (yashrc):
2830 = The prompt strings are now defined with the $YASH_PS...
2931 variables.
--- yash/trunk/doc/ja/posix.txt (revision 3899)
+++ yash/trunk/doc/ja/posix.txt (revision 3900)
@@ -23,6 +23,7 @@
2323 - link:expand.html#params[パラメータ展開]の{zwsp}link:expand.html#param-name[入れ子]はできません。また{zwsp}link:expand.html#param-index[インデックス]の指定はできません。
2424 - +$(+ と +)+ で囲んだ{zwsp}link:expand.html#cmdsub[コマンド置換]に含まれるコマンドは、コマンド置換が実行される時に毎回解析されます。
2525 - link:expand.html#arith[数式展開]で小数ならびに `++` および `--` 演算子が使えません。数値でない変数は常にエラーになります。
26+- link:redir.html[リダイレクト]の対象を示すトークンは次のリダイレクトのファイル記述子を示す整数と紛らわしくないようにしなければなりません。
2627 - link:redir.html#file[ファイルのリダイレクト]で、{zwsp}link:expand.html#glob[パス名展開]の結果が一つでない場合、すぐにはエラーにせず、パス名展開を行わなかったときと同様に扱います。
2728 - link:redir.html#socket[ソケットリダイレクト]・{zwsp}link:redir.html#here[ヒアストリング]・{zwsp}link:redir.html#pipe[パイプリダイレクト]・{zwsp}link:redir.html#process[プロセスリダイレクト]は使用できません。
2829 - link:exec.html#simple[単純コマンドの実行]時、コマンドが見つからなくても link:params.html#sv-command_not_found_handler[+COMMAND_NOT_FOUND_HANDLER+ 変数]の値は実行しません。
--- yash/trunk/doc/posix.txt (revision 3899)
+++ yash/trunk/doc/posix.txt (revision 3900)
@@ -52,6 +52,8 @@
5252 +$({{commands}})+ are parsed every time the substitution is executed.
5353 - In link:expand.html#arith[arithmetic expansion], fractional numbers and the
5454 `++` and `--` operators cannot be used. All variables must be numeric.
55+- The operand of a link:redir.html[redirection] cannot be the integer prefix
56+ to a next redirection operator.
5557 - In a link:redir.html#file[redirection to a file], if the
5658 link:expand.html#glob[pathname expansion] yielded more than one or no
5759 pathname, it is not immediately treated as an error. Instead, the shell
--- yash/trunk/parser.c (revision 3899)
+++ yash/trunk/parser.c (revision 3900)
@@ -602,6 +602,8 @@
602602 __attribute__((nonnull,malloc,warn_unused_result));
603603 static redir_T *tryparse_redirect(parsestate_T *ps)
604604 __attribute__((nonnull,malloc,warn_unused_result));
605+static void validate_redir_operand(parsestate_T *ps)
606+ __attribute__((nonnull));
605607 static command_T *parse_compound_command(parsestate_T *ps)
606608 __attribute__((nonnull,malloc,warn_unused_result));
607609 static command_T *parse_group(parsestate_T *ps)
@@ -2226,7 +2228,7 @@
22262228
22272229 /* parse redirection target file token */
22282230 next_token(ps);
2229- psubstitute_alias_recursive(ps, 0);
2231+ validate_redir_operand(ps);
22302232 result->rd_filename = ps->token, ps->token = NULL;
22312233 if (result->rd_filename != NULL)
22322234 next_token(ps);
@@ -2236,7 +2238,7 @@
22362238
22372239 parse_here_document_tag:
22382240 next_token(ps);
2239- psubstitute_alias_recursive(ps, 0);
2241+ validate_redir_operand(ps);
22402242 result->rd_hereend =
22412243 xwcsndup(&ps->src.contents[ps->index], ps->next_index - ps->index);
22422244 result->rd_herecontent = NULL;
@@ -2260,6 +2262,21 @@
22602262 return result;
22612263 }
22622264
2265+/* Performs alias substitution on the current token.
2266+ * Rejects the current token if it is an IO_NUMBER token. */
2267+void validate_redir_operand(parsestate_T *ps)
2268+{
2269+ do {
2270+ if (posixly_correct && ps->tokentype == TT_IO_NUMBER) {
2271+ assert(ps->next_index > 0);
2272+ serror(ps, Ngt("put a space between `%lc' and `%lc' "
2273+ "for disambiguation"),
2274+ ps->src.contents[ps->next_index - 1],
2275+ ps->src.contents[ps->next_index]);
2276+ }
2277+ } while (psubstitute_alias(ps, 0));
2278+}
2279+
22632280 /* Parses a compound command.
22642281 * `command' is the name of the command to parse such as "(" and "if".
22652282 * Returns NULL iff the current token does not start a compound command. */
--- yash/trunk/po/ja.po (revision 3899)
+++ yash/trunk/po/ja.po (revision 3900)
@@ -8,8 +8,8 @@
88 msgstr ""
99 "Project-Id-Version: yash 2.48\n"
1010 "Report-Msgid-Bugs-To: http://osdn.jp/projects/yash/forums/\n"
11-"POT-Creation-Date: 2018-09-23 11:28+0900\n"
12-"PO-Revision-Date: 2017-10-28 13:09+0900\n"
11+"POT-Creation-Date: 2018-09-30 21:52+0900\n"
12+"PO-Revision-Date: 2018-09-30 21:55+0900\n"
1313 "Last-Translator: WATANABE Yuki <magicant@users.osdn.me>\n"
1414 "Language-Team: Japanese\n"
1515 "Language: ja\n"
@@ -232,9 +232,9 @@
232232 msgid "\tprintf format [value...]\n"
233233 msgstr "\tprintf 書式 [値...]\n"
234234
235-#: builtins/test.c:82 builtins/test.c:425 parser.c:850 parser.c:1348
236-#: parser.c:1436 parser.c:1464 parser.c:1591 parser.c:1630 parser.c:2130
237-#: parser.c:2434 parser.c:2522 parser.c:2602
235+#: builtins/test.c:82 builtins/test.c:425 parser.c:852 parser.c:1349
236+#: parser.c:1437 parser.c:1462 parser.c:1594 parser.c:1633 parser.c:2142
237+#: parser.c:2466 parser.c:2554 parser.c:2634
238238 #, c-format
239239 msgid "`%ls' is missing"
240240 msgstr "「%ls」が抜けています"
@@ -985,195 +985,200 @@
985985 "\tset [オプション...] [--] [新しい位置パラメータ...]\n"
986986 "\tset -o|+o # 現在の設定を表示する\n"
987987
988-#: parser.c:788
988+#: parser.c:790
989989 msgid "syntax error: "
990990 msgstr "構文エラー: "
991991
992-#: parser.c:802
992+#: parser.c:804
993993 #, c-format
994994 msgid "encountered `%ls' without a matching `('"
995995 msgstr "「%ls」に対応する「(」がありません"
996996
997-#: parser.c:804
997+#: parser.c:806
998998 #, c-format
999999 msgid "encountered `%ls' without a matching `{'"
10001000 msgstr "「%ls」に対応する「{」がありません"
10011001
1002-#: parser.c:806
1002+#: parser.c:808
10031003 #, c-format
10041004 msgid "`%ls' is used outside `case'"
10051005 msgstr "「%ls」が case コマンドの外で使われています"
10061006
1007-#: parser.c:808 parser.c:810 parser.c:2618
1007+#: parser.c:810 parser.c:812 parser.c:2650
10081008 #, c-format
10091009 msgid "`%ls' cannot be used as a command name"
10101010 msgstr "「%ls」はコマンド名として使えません"
10111011
1012-#: parser.c:812 parser.c:825
1012+#: parser.c:814 parser.c:827
10131013 #, c-format
10141014 msgid "encountered `%ls' without a matching `if' and/or `then'"
10151015 msgstr "「%ls」に対応する「if」または「then」がありません"
10161016
1017-#: parser.c:815
1017+#: parser.c:817
10181018 #, c-format
10191019 msgid "encountered `%ls' without a matching `if' or `elif'"
10201020 msgstr "「%ls」に対応する「if」または「elif」がありません"
10211021
1022-#: parser.c:817
1022+#: parser.c:819
10231023 #, c-format
10241024 msgid "encountered `%ls' without a matching `for', `while', or `until'"
10251025 msgstr "「%ls」に対応する「for」「while」または「until」がありません"
10261026
1027-#: parser.c:820
1027+#: parser.c:822
10281028 #, c-format
10291029 msgid "encountered `%ls' without a matching `do'"
10301030 msgstr "「%ls」に対応する「do」がありません"
10311031
1032-#: parser.c:822
1032+#: parser.c:824
10331033 #, c-format
10341034 msgid "encountered `%ls' without a matching `case'"
10351035 msgstr "「%ls」に対応する「case」がありません"
10361036
1037-#: parser.c:848
1037+#: parser.c:850
10381038 #, c-format
10391039 msgid "(maybe you missed `%ls'?)"
10401040 msgstr "(「%ls」を忘れていませんか?)"
10411041
1042-#: parser.c:1151
1042+#: parser.c:1153
10431043 msgid "the double quotation is not closed"
10441044 msgstr "二重引用符が閉じられていません"
10451045
1046-#: parser.c:1168
1046+#: parser.c:1170
10471047 msgid "the single quotation is not closed"
10481048 msgstr "単一引用符が閉じられていません"
10491049
1050-#: parser.c:1326
1050+#: parser.c:1327
10511051 msgid "the parameter name is missing or invalid"
10521052 msgstr "パラメータ名が抜けているか不正です"
10531053
1054-#: parser.c:1338 parser.c:1343
1054+#: parser.c:1339 parser.c:1344
10551055 msgid "the index is missing"
10561056 msgstr "インデックスが抜けています"
10571057
1058-#: parser.c:1370 parser.c:1383
1058+#: parser.c:1371 parser.c:1384
10591059 #, c-format
10601060 msgid "invalid character `%lc' in parameter expansion"
10611061 msgstr "パラメータ展開に無効な文字「%lc」が混じっています"
10621062
1063-#: parser.c:1379 parser.c:1394 parser.c:1438
1063+#: parser.c:1380 parser.c:1395 parser.c:1439
10641064 #, c-format
10651065 msgid "invalid use of `%lc' in parameter expansion"
10661066 msgstr "パラメータ展開において「%lc」の使い方が正しくありません"
10671067
1068-#: parser.c:1539
1068+#: parser.c:1538
10691069 msgid "the backquoted command substitution is not closed"
10701070 msgstr "「`」によるコマンド置換が閉じられていません"
10711071
1072-#: parser.c:1786
1072+#: parser.c:1789
10731073 msgid "`;' or `&' is missing"
10741074 msgstr "「;」または「&」が抜けています"
10751075
1076-#: parser.c:1893
1076+#: parser.c:1898
10771077 msgid "ksh-like extended glob pattern `!(...)' is not supported"
10781078 msgstr "ksh の拡張パターン「!(...)」は利用できません"
10791079
1080-#: parser.c:1987
1080+#: parser.c:1999
10811081 msgid "a command is missing at the end of input"
10821082 msgstr "入力の最後でコマンドが抜けています"
10831083
1084-#: parser.c:1989
1084+#: parser.c:2001
10851085 #, c-format
10861086 msgid "a command is missing before `%lc'"
10871087 msgstr "「%lc」の前にコマンドがありません"
10881088
1089-#: parser.c:2191
1089+#: parser.c:2203
10901090 msgid "pipe redirection is not supported in the POSIXly-correct mode"
10911091 msgstr "パイプリダイレクトは POSIX 準拠モードでは使えません"
10921092
1093-#: parser.c:2209
1093+#: parser.c:2221
10941094 msgid "here-string is not supported in the POSIXly-correct mode"
10951095 msgstr "ヒアストリングは POSIX 準拠モードでは使えません"
10961096
1097-#: parser.c:2224
1097+#: parser.c:2236
10981098 msgid "the redirection target is missing"
10991099 msgstr "リダイレクトの対象が抜けています"
11001100
1101-#: parser.c:2234
1101+#: parser.c:2246
11021102 msgid "the end-of-here-document indicator is missing"
11031103 msgstr "ヒアドキュメントの終端子が抜けています"
11041104
1105-#: parser.c:2243
1105+#: parser.c:2255
11061106 msgid "process redirection is not supported in the POSIXly-correct mode"
11071107 msgstr "プロセスリダイレクトは POSIX 準拠モードでは使えません"
11081108
1109-#: parser.c:2249
1109+#: parser.c:2261
11101110 msgid "unclosed process redirection"
11111111 msgstr "プロセスリダイレクトが閉じられていません"
11121112
1113-#: parser.c:2319 parser.c:2353 parser.c:2439 parser.c:2483
1113+#: parser.c:2272
11141114 #, c-format
1115+msgid "put a space between `%lc' and `%lc' for disambiguation"
1116+msgstr "「%lc」と「%lc」の間に空白が必要です"
1117+
1118+#: parser.c:2342 parser.c:2384 parser.c:2471 parser.c:2515
1119+#, c-format
11151120 msgid "commands are missing between `%ls' and `%ls'"
11161121 msgstr "「%ls」と「%ls」の間にコマンドがありません"
11171122
1118-#: parser.c:2365 parser.c:2473
1123+#: parser.c:2396 parser.c:2505
11191124 #, c-format
11201125 msgid "commands are missing after `%ls'"
11211126 msgstr "「%ls」の後にコマンドがありません"
11221127
1123-#: parser.c:2402
1128+#: parser.c:2433
11241129 msgid "an identifier is required after `for'"
11251130 msgstr "「for」の後には識別子が必要です"
11261131
1127-#: parser.c:2404
1132+#: parser.c:2435
11281133 #, c-format
11291134 msgid "`%ls' is not a valid identifier"
11301135 msgstr "「%ls」は有効な識別子ではありません"
11311136
1132-#: parser.c:2423
1137+#: parser.c:2455
11331138 msgid "`;' cannot appear on a new line"
11341139 msgstr "「;」は行頭に置けません"
11351140
1136-#: parser.c:2512 parser.c:2585 parser.c:2632
1141+#: parser.c:2544 parser.c:2617 parser.c:2664
11371142 #, c-format
11381143 msgid "a word is required after `%ls'"
11391144 msgstr "「%ls」の後には単語が必要です"
11401145
1141-#: parser.c:2575
1146+#: parser.c:2607
11421147 msgid "an unquoted `esac' cannot be the first case pattern"
11431148 msgstr "クォートしていない「esac」を最初のパターンにすることはできません"
11441149
1145-#: parser.c:2588
1150+#: parser.c:2620
11461151 #, c-format
11471152 msgid "encountered an invalid character `%lc' in the case pattern"
11481153 msgstr "case のパターン内に不正な文字「%lc」があります"
11491154
1150-#: parser.c:2664 parser.c:2718
1155+#: parser.c:2696 parser.c:2750
11511156 msgid "a function body must be a compound command"
11521157 msgstr "関数の本体は複合コマンドでなければなりません"
11531158
1154-#: parser.c:2686
1159+#: parser.c:2718
11551160 #, c-format
11561161 msgid "invalid use of `%lc'"
11571162 msgstr "「%lc」の使い方が正しくありません"
11581163
1159-#: parser.c:2693
1164+#: parser.c:2725
11601165 msgid "invalid function name"
11611166 msgstr "無効な関数名です"
11621167
1163-#: parser.c:2703
1168+#: parser.c:2735
11641169 msgid "`(' must be followed by `)' in a function definition"
11651170 msgstr "関数定義では「(」の直後に「)」が必要です"
11661171
1167-#: parser.c:2731
1172+#: parser.c:2763
11681173 msgid "the end-of-here-document indicator contains a newline"
11691174 msgstr "ヒアドキュメントの終端子に改行が入っています"
11701175
1171-#: parser.c:2758 parser.c:2792
1176+#: parser.c:2790 parser.c:2824
11721177 #, c-format
11731178 msgid "the here-document content is not closed by `%ls'"
11741179 msgstr "ヒアドキュメントが「%ls」で閉じられていません"
11751180
1176-#: parser.c:2844
1181+#: parser.c:2876
11771182 #, c-format
11781183 msgid "here-document content for %s%ls is missing"
11791184 msgstr "%s%ls に対応するヒアドキュメントの内容がありません"
Show on old repository browser