[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:08348] Re: man -c error(Permission denied)



宇野です。

#そろそろdevelに振ります。

man -c で発生するエラーについて、少し調べてみました。
問題は2つありました。

1. man -c hogeでPermission deniedになる
2. potato環境でman hogeとしても/var/catman以下にキャッシュされない

1. man -c hogeでPermission deniedになる

これは、src/man.cの1740行目で、わざわざ権限をコマンドを実行した本当の
ユーザにしているためです。
今のDebianのポリシーでは、ここはmanしか書き込めないため、この処理は
不要です。ディストリビューションによっては正しい処理ですので、Debian
固有の問題と思われます。
これは、1740行目の
status = do_system_drop_privs (cmd);
を
status = do_system (cmd);
に直せば動作するようになります。



2. potato環境でman hogeとしても/var/catman以下にキャッシュされない

pclose()関数がうまく動作していないようです。
src/man.c内のformat_display_and_save()関数では、
その名の通り表示と保存を行ないますが、その際にpopen()/pclose()を
使用しています。
しかし、1589行目のpclose()で、-1が返ってしまうため、
その次の処理であるキャッシュファイルの保存もされません。
これはmanにとって致命的ではないため、そのままほっとかれます:-)
これをてっとり早く解決する方法は、BROKEN_PCLOSEを定義することです。

#本当にpclose()そのものの問題なのかどうかはglibcのソース見なきゃ
#わかりませんが、そこまでやってないです。

で、よくよくconfigureを見ると、pclose()のテストをしており、さらに
pclose()が動作しないことまでちゃんと判定しています。
それでもなお、これが有効になっていないのもおかしいです。
が、この辺も時間がなくてこれ以上調べてないです。

ともかく無理矢理にでもBROKEN_PCLOSEを入れれば動作するようになります。

以上、私が調べたこと。

以下本当にとりあえず動作させるためのパッチ

--- man.c.ORIG	Tue Apr  6 18:23:37 1999
+++ man.c	Wed Apr  7 05:02:38 1999
@@ -155,6 +155,7 @@
 #if defined(__ultrix) || defined(__alpha)
 #define BROKEN_PCLOSE
 #endif
+#define BROKEN_PCLOSE
 
 #ifdef MAN_CATS
 #  ifdef BROKEN_PCLOSE
@@ -1737,7 +1738,8 @@
 						       catman for non-root.
 						 */
 						push_cleanup ((void (*)())unlink, tmpcat);
-						status = do_system_drop_privs (cmd);
+						/* status = do_system_drop_privs (cmd); */
+						status = do_system (cmd);
 						if (status) gripe_system (cmd, status);
 						free (cmd);