2009年12月30日

[debian-users:53476] Re: bind9のエラーについて

國母と申します。

OpenBlocks とどの程度類似性があるかわかりませんが、
ppc mac mini があったので少しだけ調べてみました。

残念ながら問題の解決法は見つけられませんでしたが、
ご参考になれば幸いです。


On Mon, 28 Dec 2009 04:27:10 +0900
Takeshi Kusune <kusune@xxxxx> san wrote:

> strace -ff して SIGSEGV を吐いてるプロセスの log を見る限りでは、
> 直前に capget が EBADF を返してるのが怪しそうではありますね。
> 一応最後にログをつけておきます。
...
> brk(0) = 0x20086000
> brk(0x200a7000) = 0x200a7000
> socket(PF_FILE, SOCK_DGRAM, 0) = 3
> fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
> connect(3, {sa_family=AF_FILE, path="/dev/log"...}, 110) = 0
> capget(0x20080522, 0, NULL) = -1 EFAULT (Bad address)
> --- SIGSEGV (Segmentation fault) @ 0 (0) ---

capget は libcap2 の、cap_alloc.c:cap_init() で呼ばれているもののように思います。
(末尾に ppc mac mini で実行した結果を添付します。segv しませんでした。)
- EFAULT でも、システムコールの動作自体に問題は無い(ように見える。ログ参照。)
- bind9 で cap_init() を呼んでいる部分を見ると、cap_init() が
少なくとも二回連続で呼ばれる。( bind9-9.5.1.dfsg.P3/bin/named/unix/os.c のマクロ)
ので、cap_alloc.c のなかの、cap_init(), cap_free() あたりで
変なことになっているのではないかと想像します。(妄想レベルですが。)

libcap2 はサイズも小さく、一回 dpkg-buildpackage などをしてしまえば、それ以降、
libcap2-2.11/libcap 内で make するだけで libcap.so を更新できます。
(多分)openblocks でもそんなに時間はかからないと思いますので、
お時間があれば -g を付けてビルドして、gdb 上で走らせるとか、
printf debug なんかも比較的楽だと思いますので
よろしければ試していただくと良いかもしれません。

# ちなみに cap_alloc.c は結構トリッキーなメモリ操作をしているように見えます。(主観)
# そのため、alignment の問題なんかで落ちてたりするんじゃあるまいか、
# と、思わなくもないです。(お行儀悪いコードだな。と。)しかしその場合は、
# Bus Error になったようなならなかったような。。。 ppc はどっちだったかなぁ。


------------------------------------------------------------
...
brk(0) = 0x20086000
brk(0x200a7000) = 0x200a7000
socket(PF_FILE, SOCK_DGRAM, 0) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
connect(3, {sa_family=AF_FILE, path="/dev/log"...}, 110) = 0
capget(0x20080522, 0, NULL) = -1 EFAULT (Bad address)
capget(0x20080522, 0, NULL) = -1 EFAULT (Bad address)
capget(0x20080522, 0, {CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCA
ST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_S
YS_TIME|CAP_SYS_TTY_CONFIG|0xf8000000, CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE
|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SY
S_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|0xf8000000, 0}) = 0
getuid() = 0
...

------------------------------------------------------------

$ uname -a
Linux mini1 2.6.26-2-powerpc #1 Thu Nov 5 02:56:30 UTC 2009 ppc GNU/Linux

$ cat /proc/cpuinfo
processor : 0
cpu : 7447A, altivec supported

--
國母隆一 : Kokubo Ryuichi
mailto:ryu1@xxxxx
mailto:ryu1kkb@xxxxx
PGP Key ID: 86F7FE70
Key Fingerprint: D3CB 8848 4FB7 51A4 C7AB 3F53 6C4D B397 86F7 FE70


投稿者 xml-rpc : 2009年12月30日 22:51
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/91901
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。