68user's page 掲示板

Prev< No. 225〜226> Next  [最新発言に戻る] [過去ログ一覧]
No. 225 # mm 1999/03/25 (木) 23:55
先日某所で尋ねられた件について、ちょっと分からなかったので、
質問させて下さい。

尋ねられた内容は、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ヒープの場合のように、メモリ上に
ゴミとして残るのでしょうか?
それとも、プロセスの終了を見て、システムが自動的に解放
してくれるのでしょうか?

No. 226 # M.Masuda 1999/03/26 (金) 00:00
>「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

Prev< No. 225〜226> Next  [最新発言に戻る] [過去ログ一覧]