The Man Who Fell From The Wrong Side Of The Sky:2007年8月分

2007/8/6(Mon)

[NetBSD] compat_linux.o

いつものことだけども/usr/lkm/compat_linux.oがmodloadできなくなっとる、4.99.25。
あとでちとチェックしとくか。

最近買ったもの

The Traveling Wilburys Collection
もう長いこと廃盤状態だったとは知らんかったが、リマスタ+DVD付きで再発なのでゲと。

2007/8/7(Tue)

[NetBSD] 続 compat_linux.o

/usr/lkm/compat_linux.o: In function `linux_sys_ptrace':
: undefined reference to `linux_sys_ptrace_arch'
/usr/lkm/compat_linux.o:(.data+0xb88): undefined reference to `linux_sys_futex'
modload: can't prelink `/usr/lkm/compat_linux.o' creating `/usr/lkm/compat_linux'

前者のlinux_sys_ptraceは kern/34478で報告済のやつ。
linux_sys_futexの方はこんなパッチでおk。

Index: sys/compat/linux/common/linux_futex.c
===================================================================
RCS file: /cvsroot/src/sys/compat/linux/common/linux_futex.c,v
retrieving revision 1.7
diff -u -r1.7 linux_futex.c
--- sys/compat/linux/common/linux_futex.c	24 Jul 2006 19:01:49 -0000	1.7
+++ sys/compat/linux/common/linux_futex.c	7 Aug 2007 02:04:22 -0000
@@ -34,6 +34,8 @@
 #include <sys/cdefs.h>
 __KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.7 2006/07/24 19:01:49 manu Exp $");
 
+#include <sys/param.h>
+#include <sys/kernel.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/systm.h>
@@ -43,6 +45,8 @@
 #include <sys/lock.h>
 #include <sys/malloc.h>
 
+#include <compat/linux/common/linux_types.h>
+#include <compat/linux/common/linux_signal.h>
 #include <compat/linux/common/linux_futex.h>
 #include <compat/linux/linux_syscallargs.h>
 
Index: sys/lkm/compat/linux/Makefile
===================================================================
RCS file: /cvsroot/src/sys/lkm/compat/linux/Makefile,v
retrieving revision 1.32
diff -u -r1.32 Makefile
--- sys/lkm/compat/linux/Makefile	22 Apr 2007 08:30:01 -0000	1.32
+++ sys/lkm/compat/linux/Makefile	7 Aug 2007 02:04:22 -0000
@@ -22,6 +22,7 @@
 SRCS+=	linux_machdep.c linux_syscalls.c linux_sysent.c
 SRCS+=	linux_fdio.c linux_hdio.c linux_blkio.c linux_sysctl.c
 SRCS+=	linux_sg.c linux_mtio.c
+SRCS+=	linux_ptrace.c linux_futex.c
 
 # XXXX - temporary, not applicable for kernel with COMPAT_43, OSSAUDIO
 #.PATH: $S/compat/common $S/compat/ossaudio

それと kern/34010は最近直っとるな、closeしとくか。

[FreeBSD] どうでもいいネタ

src/libexec/rtld-elf/rtld.h rev1.38

93 typedef struct Struct_Name_Entry {
94 	STAILQ_ENTRY(Struct_Name_Entry) link;
95 	char   name[1];
96 } Name_Entry;

src/libexec/rtld-elf/rtld.c rev1.124

3144 static void
3145 object_add_name(Obj_Entry *obj, const char *name)
3146 {
3147 	Name_Entry *entry;
3148 	size_t len;
3149 
3150 	len = strlen(name);
3151 	entry = malloc(sizeof(Name_Entry) + len);
3152 
3153 	if (entry != NULL) {
3154 		strcpy(entry->name, name);
3155 		STAILQ_INSERT_TAIL(&obj->names, entry, link);
3156 	}
3157 }

3151行目の + len を見てなくてオーバーフロー疑っちまったぜ。
これはstrdup(3)とか使わずにmalloc(3)一回で済ませて性能を稼ぐ意図なのかねぇ。
リンクローダってそんな切羽詰った実装しないとダメなのかな?

2007/8/8(Wed)

[OpenBSD] 私は如何にして心配するのを止めてCitrusを(以下ry

なぜOpenBSDのCitrusは完全体でないのか(フリーザ様AA略
http://www.undeadly.org/cgi?action=article&sid=20070806022021&pid=41

Theoにとっての 夏蜜柑が四つPlain Citrusにあるいくつかの問題ってなんだろうね、やっぱdlopen(3)かねぇ。

もしかしてBSD AUTHみたくmultibyte encoding moduleをshared libraryでなくexecutableにすりゃ
納得するんだろうかwwwwwちょww無意味wwww

2007/8/13(Mon)

先週末

奥多摩行ってきた。

天気は最高だったんだけども
夏休み中ということで子供連れ家族で大渋滞、時間おせおせ。
バーベキューも日が暮れかかってから大急ぎになってしまった、あーあ。
桧原村まで行って数馬の湯に浸かって、その後ペルセウス流星群を見る予定だったのが
奥多摩周遊道路の19:00-8:00通行止に10分の差で引っかかってしまい断念、もえぎの湯に変更。
狭いし混んでるしお湯ぬるぽでいまいちだった。

2007/8/22(Wed)

[NetBSD] Citrus iconv

リハビリがてらn-byte hangulのモジュール書いた、週末時間あればcommitすんべ。

最近買った本

2007/8/27(Mon)

先週末

雑巾風味のコーヒーと猫もまたぐ腐臭ツナパスタにやられて寝込んでた。

[BTS] Trac 0.10.4

しばらく会社のtrac鯖放置してたので更新した。
LC_TIMEがUTF-8ロケールでない場合

バグ対策パッチがあたらなくなってたので更新。
/distfiles/trac/trac-0.10.4-strftime_use_nl_langinfo_codeset.patch.gz

あ、ちなみにtrac-jaの方はstrftime/strptimeに喰わせるformat自体を
無理矢理'%x %X'でなく'%Y/%m/%d %H:%M:%S'に変えてしまうとゆー
adhocでkludgeな対策してるみたいなんで上のpatchはrejectでます。

ついでにFC6からFC7に更新、近いうちにSuSEに入れ換える。

2007/8/28(Tue)

[NetBSD] いろいろ

最近買ったもの

2007/8/30(Thu)

[NetBSD] wc: filename: invalid byte sequence

tech-userlevelネタ
wizd(8)氏の添付したmp3ファイル(のようなもの)じゃde_DE.UTF-8ロケールでも再現しないねぇ。

ソース。

143		r = mbrtowc(wc, p, mblen, st);
144		if (r == (size_t)-1) {
145			warnx("%s: invalid byte sequence", file);
146			rval = 1;
147
148			/* XXX skip 1 byte */
149			mblen--;
150			p++;
151			memset(st, 0, sizeof(*st));
152			continue;
153		} else if (r == (size_t)-2)
154			break;
155		else if (r == 0)
156			r = 1;

そもそも*.mp3のよなバイナリをUTF-8だとしてmbrtowc(3)に喰わせれば
EILSEQになる可能性は高い、wc -cを使いましょうってことで。

↑の問題とは関係ないんだけど、今の実装だとmbrtowc(3)の使い方がちとマズイ。
注目は155〜156行目、mbrtowc(3)の 仕様書には「戻り値として0が返ってきた場合
変換結果はnullワイド文字になる」と書いてある。

Warning:'RETURN' is reserved.
RETURN 
    0
        If the next n or fewer bytes complete the character that corresponds
        to the null wide character (which is the value stored).


なので

のはとても正しいように思えるんだけど、実際には

もいっこバグ見つけた。

206		while ((len = read(fd, buf, MAXBSIZE)) > 0) {
207			if (dochar) {
208				size_t wlen;
209
210				r = do_mb(0, (char *)buf, (size_t)len,
211				    &st, &wlen, name);

テキストファイルからread(2)で読み込んだバイト列に'\0'つかない時
iconv(1)のISO-2022-JP問題と同様の問題が発生する悪寒、ひー。

さてどうやって修正しますかねぇ…
Citrus API直接呼ぶのもアレなので

285	if (dochar && r == (size_t)-2) {
286		warnx("%s: incomplete multibyte character", name);

285	if (dochar && r == (size_t)-2 && !mbsinit(&st)) {
286		warnx("%s: incomplete multibyte character", name);

とかしてmbsinit(3)によるチェックくらいでお茶を濁す?

ここまでの 暫定patch

まあテキストファイルであれば通常末尾にnewline(0xa)があることが多いんで
これを意図的に除去しない限りは

$ LC_ALL=ja_JP.ISO2022-JP wc -m hoge.txt
wc: hoge.txt: incomplete multibyte character

が発生することはないよなぁ、発生頻度は低そうなのでしばらく放置するかね。

*1:まあ問題になるのはVIQRとかzWなんかの7bit stateful encodingくらいだけど。
*2:なので'\0' != L'\0'でないUTF-16とかUTF-32のようなCESは扱うことができない。

RSS

壊れてたみたい、失礼しました。

2007/8/31(Fri)

A Wikiscanner Darkly

「お前一日中ヒキってWikipediaの編集合戦ってどんだけよ?」


「あ? オリャぁアリマキ駆除してんだよ。」

「ってかアリマキって何よ? アリマキなんか何処にもいないぜ?」

「オメーもそのうち奴らに洗脳されちまうぜ? それがアリマキさ。
 ネットの何処からでも湧いきて、俺の秀逸な記事を削除しようとしやがる。
 もう耐えらんねぇ … こっちが病院送りになっちまう。」

「なんでオレにゃ見えねーの?」

「ほれ見ろぉぉぉぉ!このアリマキ cia.gov からだぜぇぇぇぇぇ!」

(以下略)

そしてフレッド潜入捜査官のように自分で自分を(以下略)って話なのか?

というわけで ``A Scanner Darkly'' - Philip K. Dick 苦労しながら原著読んでるんだが
このあたりのシーンの台詞が「シンナーに気をつけて」とか「盗聴エディ」に脳内変換されて非常に困る。