アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
argv[0] (スコア:1)
strcpyしちゃいけません。領域オーバするでしょ。
execve呼出は*argv[]でやってるでしょ。main()で受け取ってるのも
それでしょ。
argv[0]="hogehoge";
とかで、argv[0]というポインタ自体を書きかえればいいんです。
それに必要な領域は自分で責任持って確保してください。
Re:argv[0] (スコア:1)
execveされた側で書き換えるということでいいでしょうか。
int main(int argc, char* argv[], char* envp[])
{
if(*argv[0] != '-'){
/* argv[0]が "-" で始まっていなければ自分自身を呼びなおす */
char* newargv0 = (char*)malloc(1024+1); /* 1024バイト分確保 */
char* oldargv0 = argv[0];
memset(newargv0, ' ', 1024); /* 空白で埋める。そうしないと子プロセスにわたったときに切り詰められてしまう */
newargv0[0] = '-';
newargv0[1024] = 0;
argv[0] = newargv0;
execve(oldargv0, argv, envp);
}
/* execveされたプロセス */
/* 1024バイトまでなら上書きしても大丈夫 */
strncpy(argv[0], "Hello World!!",1024);
argv[0][1024] = 0;
system("ps a");
return 0;
}
実行結果
PID TTY STAT TIME COMMAND
10513 pts/3 S 0:03 -bin/tcsh
29847 pts/3 S 0:00 Hello World!! ←ちゃんと書き変わってる
29848 pts/3 R 0:00 ps a
デバッガで追ってみましたが、これなら安全に書き換えられそうです。
でも、perlでやっている方法とは違うみたいです。perlのソースを読んで
みたところ、やはり、argv, envpの領域を(連続していれば)上書きして
いるようです。
#昔はsetproctitle()という関数があったようですが、glibc2には無いみたいですね