アカウント名:
パスワード:
GNUのyesコマンドと対照的なのがOpenBSDのyesコマンドのソース [openbsd.org]。
ご覧のとおり見たまんまで、まったく捻りなし。
特徴的なのが、実行開始時にpledgeというシステムコールを発効しているところ。これを行うことで、それ以降のシステムコールの実行を標準入出力関連のものだけに制限している。もしyesに脆弱性があっても、それを利用した悪さができにくいようになっている。
改善というのは高性能化だけではない、ってことですな。
楽しいね。この単純なプログラムでさえ、システムコールを制限しようとする姿勢が。
FreeBSDはどうなんだろう、と思ってみたらちょっと長くて [openbsd.org]読んでない。
リンクミスった。FreeBSDのはこっち。 [github.com]ちなみにやってることはOpenBSD + バッファ使った性能向上かなあ。斜め読みというか、斜め見した感じ。
ちなみにminix 2.0.4のyesは以下。yes[n++]= '\n';ってなんでやってるんだろう。argv[1]って最後に終端はいるよね?
/* yes 1.4 - print 'y' or argv[1] continuously. Author: Kees J. Bot * 15 Apr 1989 */#include #include #include #include
int main(int argc, char **argv){ char *yes; static char y[] = "y"; int n;
yes= argc == 1 ? y : argv[1];
n= strlen(yes);
yes[n++]= '\n';
while (write(1, yes, n) != -1) {} exit(1);}
|yes[n++]= '\n';ってなんでやってるんだろう。|argv[1]って最後に終端はいるよね?
その終端がヌルターミネータだから改行を追加しているのでは。
ヌルターミネータを上書きして大丈夫なのかと一瞬思ったが、writeで長さ指定してた。
yes[n++]= '\n';ってなんでやってるんだろう。
これがないと出力が改行なし ("yyyyy...") になっちゃいますね。
なるほど。意味がわかったでござる。
tmiura氏のNULL Terminatorの話も、説明されてわかった。\0 を \nで上書きしていると。writeだから\0はいらないわけね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
普通のやつらの下を行け -- バッドノウハウ専門家
対照的なのが (スコア:5, 興味深い)
GNUのyesコマンドと対照的なのがOpenBSDのyesコマンドのソース [openbsd.org]。
ご覧のとおり見たまんまで、まったく捻りなし。
特徴的なのが、実行開始時にpledgeというシステムコールを発効しているところ。
これを行うことで、それ以降のシステムコールの実行を標準入出力関連のものだけに制限している。
もしyesに脆弱性があっても、それを利用した悪さができにくいようになっている。
改善というのは高性能化だけではない、ってことですな。
Re: (スコア:0)
楽しいね。
この単純なプログラムでさえ、システムコールを制限しようとする姿勢が。
FreeBSDはどうなんだろう、と思ってみたらちょっと長くて [openbsd.org]読んでない。
Re:対照的なのが (スコア:0)
リンクミスった。
FreeBSDのはこっち。 [github.com]
ちなみにやってることはOpenBSD + バッファ使った性能向上かなあ。
斜め読みというか、斜め見した感じ。
ちなみにminix 2.0.4のyesは以下。
yes[n++]= '\n';ってなんでやってるんだろう。
argv[1]って最後に終端はいるよね?
/* yes 1.4 - print 'y' or argv[1] continuously. Author: Kees J. Bot
* 15 Apr 1989
*/
#include
#include
#include
#include
int main(int argc, char **argv)
{
char *yes;
static char y[] = "y";
int n;
yes= argc == 1 ? y : argv[1];
n= strlen(yes);
yes[n++]= '\n';
while (write(1, yes, n) != -1) {}
exit(1);
}
Re:対照的なのが (スコア:2)
|yes[n++]= '\n';ってなんでやってるんだろう。
|argv[1]って最後に終端はいるよね?
その終端がヌルターミネータだから改行を追加しているのでは。
ヌルターミネータを上書きして大丈夫なのかと一瞬思ったが、writeで長さ指定してた。
Re:対照的なのが (スコア:2)
これがないと出力が改行なし ("yyyyy...") になっちゃいますね。
Re: (スコア:0)
なるほど。
意味がわかったでござる。
tmiura氏のNULL Terminatorの話も、説明されてわかった。
\0 を \nで上書きしていると。
writeだから\0はいらないわけね。