|
先日某所で尋ねられた件について、ちょっと分からなかったので、 質問させて下さい。 尋ねられた内容は、C言語に関して、 if ( NULL != (hp = gethostbyaddr(...)) ) return hp->h_name; というコードで関数が返すポインタが指し示す 文字列の実体が何処に確保されているか? (実際は、これに似たコードで、コンパイラが 警告を出したことが発端なんですが…) ということなのですが、gethostbyaddr()がポインタで返す struct hostent の実体については、 >NOTES >A return value points to static data, >which is overwritten by any subsequently called functions >using the same structure. というのを見つけて、ライブラリ内で1個だけ静的に確保して いることは分かったのですが、この struct hostent のメンバー である char *h_name が指す文字列の実体が何処に確保されて いるのかまでは分からなかったのです。 struct hostent の他のメンバーには char **h_addr_list なんてのもあるんで、これらがすべて静的領域に確保され ているとは考え難いと思います。 でも、もしmalloc()などでヒープに確保されるのであれば、 文字列の利用後に free する必要はないのでしょうか? (必要があれば、どこかに書いてあると思うので、 その必要はないとは思うのですが、だとしたら何故不要なのか がよく分からないのです。gethostbyaddr()の内部で atexti() により free() する関数を登録してるとか…?) それと、unix では、一般にプログラム内部で malloc() などで 確保したメモリをプログラムの終了までに free() を使って 明示的に解放しなかった場合、どうなるのでしょうか? WindowやMS-DOSでのFARヒープの場合のように、メモリ上に ゴミとして残るのでしょうか? それとも、プロセスの終了を見て、システムが自動的に解放 してくれるのでしょうか? |
|
>「suidperlを使う」ってのは... やっぱだめです。なんでだろ? ls -lの結果は -rwsrwxr-x 1 root 501 342 Mar 25 23:41 su.cgi* で、 su.cgiの内容は、 #!/usr/bin/suidperl $|=1; print "Content-type: text/html\n\n"; print "<html>"; print "<H3>su test</H3>"; print "<pre>\n"; print "#############################\n"; print "<hr>\n"; $_=system("cat /etc/ftpaccess"); print "$_\n"; print system("date>testfile"); print "</pre>"; print "<hr>"; print "</html>"; です。 試しに適当につくってあるので、内容が恥ずかしいんですが #!/usr/bin/suidperl の行も最初は普通にperlを指定したんだけどダメなので、 試しに上記の様にしてもやはりだめでした。 rootでコマンドラインから実行するとOKです。 もちろん /etc/ftpaccessは、600のパーミッションです。 う〜ん、わからん。 変なところが在ったら教えて下さい。 #ちなみにperlは日本語パッチが当たってますけど関係有ります? それからもう一つお願いします。 aliasを使って、あるユーザに来たメールを転送させる設定は /etc/aliasesに記述しないとだめなんでしょうか? いつもいつも御世話になりっぱなしで申し訳ないですが、お師匠様 なにとぞ宜しくお願いします。m(_ _)m |