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

[FDclone-users:01008] Re: ファイルのuid/gidが存在しないユーザのものだった場合



 しらいです。

In Message-Id <op.wv25phuqc4zqer@pc03>
        "Hironao Komatsu" <hirkmt@gmail.com>さんwrites:
> 小松です。

> ディレクトリに、uidやgidが存在しないユーザのものであるファイル……例えば
> 
>    $ ls -l
>    合計 0
>    -rw-r--r-- 1 hironao  9547 0  4月 24 13:30 yyy
>    -rw-r--r-- 1    5194 users 0  4月 24 13:31 zzz
> 
> のようなのがある場合、FDclone 3.01では10進表現のuid/gidの後ろに'\0'が紛れ
> 込んでしまうらしく、表示がそこで途切れます。

 確かに。


> で直ることは直るのですが、なんだかしっくりきません。というのも、このバグ
> は3.00lと3.00mの間で埋め込まれたようなのですが、この2つの間のdiffにはこれ
> を伺わせるような変更点はないからで……

 browse.c 側ではなくてそこから呼ばれている Xsnprintf() 側の
bug ですね。Xsnprintf() -> snprintf() という変更でも直る筈で
す。3.00l -> 3.00m で妙な挙動になってます。
 後ろに \0 が挿入されるのは browse.c の側でも折込み済で、後
でその位置に空白を上書きしています。問題は指定した文字数分だ
け Xsnprintf() が文字を埋めてくれていないことでして。
 ここでは数値と空白と合わせて 8 文字書くように指示している
のに、実際は 7 文字しか書かなかったために、8 文字目に書かれ
た \0 が 9 文字目の空白では上書きされなかった訳です。

 以下 patch です。

---- Cut Here ----
diff -u ../old/FD-3.01/printf.c ./printf.c
--- ../old/FD-3.01/printf.c	Fri Aug  3 00:00:00 2012
+++ ./printf.c	Thu Apr 25 20:49:25 2013
@@ -354,7 +354,7 @@
 			if (Xisdigit(num[len])) num[len] = '9';
 #endif
 
-	while (i++ < len) if (setchar(num[len - i], pbufp) < 0) return(-1);
+	while (i < len) if (setchar(num[len - ++i], pbufp) < 0) return(-1);
 
 	if (width >= 0) for (; i < width; i++) {
 		if (setchar(' ', pbufp) < 0) return(-1);

---- Cut Here ----

 一見同じことをしているようですが、loop を抜けた後の i の値
が異なるので、この修正箇所に続く次の loop 回数が異なることに
なります。
 3.00l まではこの修正箇所は普通の for loop だったので、loop
終了時は i = len でした。3.00m...3.01 ではそれが i = len + 1
になってますね。
 uid/gid 以外にも printf でこの手の指示をしている箇所はある
のですが、他は直接端末に書いてるので後続の空白が一文字足りな
くても気づくことはないでしょう。


 さて、この patch を適用した 3.01a を早々に release したい
ところなんですが、今しがたその準備をしていたら MS-DOS 開発環
境が起動しないことに気づきました。
 前回の release から一年近く経っていて、その間全然起動して
いなかったもので、このうんともすんとも言わない PC に何が起き
たのか皆目見当も付きません。

 まぁ MS-DOS 版なんか見捨ててしまっていいんでしょうけど、時
間が出来たらちょっと足掻いてみようと思うので、release は暫く
お待ち下さい。
 多分電源ユニットだと思うんですけど、実はこないだまで骨折で
入院していて未だ普通に歩けない状況なんで、この手の力仕事は難
易度が高いんです。申し訳ありません。

                                               しらい たかし