[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:14146] 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);