mendexのコンソール出力が変になる

mendexのコンソール出力が変になる

- 井汲 景太 の投稿
返信数: 43
mendexのバグと思われる現象に遭遇したので報告します。

vmware上の FreeBSD 11.0-RELEASE-p8 で、TeXLive2016の先月半ばくらいにアップデートしたバージョンを使っています。

添付ファイルの tar をほどいて得られる mendbug.tex, mendbug.dic(日本語コードはいずれも EUC)に対し、
platex -kanji=euc mendbug.tex
mendex -E -d mendbug.dic mendbug.idx
を実行すると、
This is mendex version 2.6f [14-Aug-2009] (euc) (TeX Live 2016).
Scanning dictionary file ./mendbug.dic....done.
Scanning input file mendbug.idx.
Error: 愛上尾 is no entry in dictionary file in mendbug.idx, line 1....done (0 entries accepted, 1 rejected).
0 entries accepted, 1 rejected.
1 errors, written in mendbug.愛上尾.
Nothing written in output file.
となって、ご覧の通り下から2行目の拡張子の表示が変です。どうも辞書ファイルの内容に依存する動作らしく、別の辞書ファイルに変えると特に問題が出なかったりします。

おかしいのは拡張子の表示だけで、実際には mendbug.ilg というファイルができています。

さらに何か必要な情報があれば、調べて提供します。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- Akira Kakuto の投稿
Windows でやって見ると,再現できませんでした:

... ...
0 entries accepted, 1 rejected.
1 errors, written in mendbug.ilg.
Nothing written in output file.
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
windows 10 の TeXLive2016(これも更新時期は3月半ばくらい?)で試すと、こちらでも再現しないですね。プラットフォームにも依存する現象のようです。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- aminophen の投稿
Mac (El Capitan 10.11.6) 上でビルドした TeX Live 2017 開発版(2017/03/29 の svn 相当)
でも再現していません。Drag and Drop UpTeX (UpTeX.app) 20160907_2 版も再現しませんでした。
aminophen への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
追試ありがとうございます。となると、mendex 自体のバグではなく、FreeBSD 用の mendex の公式バイナリの build に何か問題があったりするのでしょうか…。他に TeXLive amd64-freebsd の環境の方がいらしたら、追試していただけると助かります。

補足: FreeBSD の ports ではなく、TeXLive から提供されている tlmgr で直接インストールしています。ports で自前でコンパイルした環境とは状況が違うかもしれません。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
VirtualBox にて レポートに提示された FreeBSD をいれ network から install-tl-unx.tar.gzを解凍したインストールスクリプトを利用して TeXLive 2016 を導入して検証しましたが、コンソール出力が乱れることはありませんでした。

久しぶりの FreeBSD なので、手違いがあるかもしれないのですが一報まで。

ちなみに MacOS Siera 10.12.4 も問題はありませんでした。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
訂正です

キーボードの設定が Mac にあっていなかったので面倒になり Mac の Terminal や iTerm から ssh で入るとレポートにあったように乱れが生じますね。

表示に問題のなかったのは Vitual Box の FreeBSD のコンソールやその X11 環境のターミナルでした。

bash を使っていたので set の出力結果を比較しても違いはなかったです。
truss で system call のトレースしてみましたが比較結果に違いはなさそうに見えましたがどうやら何か文字を出力しているようです。

mwrite(2,"m",1) = 1 (0x1)
ewrite(2,"e",1) = 1 (0x1)
nwrite(2,"n",1) = 1 (0x1)
dwrite(2,"d",1) = 1 (0x1)
bwrite(2,"b",1) = 1 (0x1)
uwrite(2,"u",1) = 1 (0x1)
gwrite(2,"g",1) = 1 (0x1)
.write(2,".",1) = 1 (0x1)
<B0>write(2,"\M-0",1) = 1 (0x1) <= ここから
<A6>write(2,"\M-&",1) = 1 (0x1)
<BE>write(2,"\M->",1) = 1 (0x1)
<E5>write(2,"\M-e",1) = 1 (0x1)
<C8>write(2,"\M-H",1) = 1 (0x1)
<F8>write(2,"\M-x",1) = 1 (0x1) <= ここまで
.write(2,".",1) = 1 (0x1)

write(2,"\n",1) = 1 (0x1)
Nwrite(2,"N",1) = 1 (0x1)
owrite(2,"o",1) = 1 (0x1)
twrite(2,"t",1) = 1 (0x1)
hwrite(2,"h",1) = 1 (0x1)
iwrite(2,"i",1) = 1 (0x1)
nwrite(2,"n",1) = 1 (0x1)
gwrite(2,"g",1) = 1 (0x1)
write(2," ",1) = 1 (0x1)
wwrite(2,"w",1) = 1 (0x1)

#可能であれば昼休みにソースを追ってみます

和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
検証ありがとうございました。端末の種類や状態にもよるかもしれない現象なのですね。

私の所では、X window の mate デスクトップ環境で、kterm 上で tcsh を使っています。和田さんと違って、X11上で表示がおかしくなっています。
mate, kterm は FreeBSD のバイナリパッケージ pkg で導入したもので、kterm は X resource で日本語コードを EUC にして使っています。tcsh は FreeBSD に付属のものです。

stty all の出力は次の通りです。
speed 9600 baud; 42 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
        -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany -imaxbel -ignbrk
        -brkint -inpck -ignpar -parmrk
oflags: opost onlcr -ocrnl tab0 -onocr -onlret
cflags: cread cs8 parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
        -dtrflow -mdmbuf
discard dsusp   eof     eol     eol2    erase   erase2  intr    kill    
^O      ^Y      ^D      <undef> <undef> ^H      ^@      ^C      ^U      
lnext   min     quit    reprint start   status  stop    susp    time    
^V      1       ^\      ^R      ^Q      ^@      ^S      ^Z      0       
werase  
^W      

関係あるかもしれない環境変数の値をいくつか挙げます。
LANG=ja_JP.eucJP
TERM=kterm-color
TERMCAP=kterm-color|kterm-co:pa#64:Co#8:AF=\E[3%dm:AB=\E[4%dm:op=\E[39;49m:hs:es:ts=\E[?E\E[?%i%dT:fs=\E[?F:ds=\E[?H:KJ:sc=\E7:rc=\E8:cs=\E[%i%d;%dr:TY=ascii:eA@:as=\E(0:ae=\E(B:am:bs:km:mi:ms:pt:xn:co#80:kn#20:li#24:*6=\E[4~:@0=\E[1~:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:ct=\E[3g:dc=\E[P:dl=\E[M:ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:md=\E[1m:me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:rs=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:us=\E[4m:

LANG 以外に locale 関連の環境変数は設定していません。

mendbug.ilg の内容はこうです。
This is mendex version 2.6f [14-Aug-2009] (euc) (TeX Live 2016).
Scanning dictionary file ./mendbug.dic....done.
Scanning input file mendbug.idx.
Error: 愛上尾 is no entry in dictionary file in mendbug.idx, line 1....done (0 e
ntries accepted, 1 rejected).
0 entries accepted, 1 rejected.
1 errors, written in mendbug.愛上尾.
Nothing written in output file.

当該の現象が起きているスクリーンショットを添付します。

追記: bash や fish に切り替えてみても同じ現象が起きました。
添付 screenshot.png
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
FreeBSD インストール時に kde 入れたんだけど startx するとほぼ素の X 恥ずかしいなので こちらは xterm でした 恥ずかしい
Xを終了させ コンソール で試すこと可能ですか?

また kterm 上で truss でシステムコールの状況はどうでしたか?おそらく mendbug. が一バイトづつ出力されたその後に愛上尾に相当する六バイト分が出力されると思います。お時間があればチェックして見てください。

今までの情報では「愛上尾」の文字列が .dic ファイルによる影響だというように受け取っていたのですが、添付の画像から判断すると .idx を読み込んだ情報が紛れ込んだように思いますので明日この点を踏まえて再度ソースを追いかけて見ます。

さて ... まだ原因はわかりません 悲しい ので中間報告

ソースは CTAN から 2016 にリリースした際と思われる texlive-20160523-source.tar ファイルのものを展開して調査しています。

実験して判明したこと。

1) texlive 2016 のソースから rebuild した mendex では問題のゴミは発生しないように思えますが、リビルド方法に問題があるかどうか検討中。デバッグオプション -g 付きとそうでないもの両方出力されません。truss でも出ません。

# rebuild に問題があるのか本格的な symbolic debug は未到達 悲しい

2) texlive 2017 向けのソースだと Error: 愛上尾 自体も以下のように出力されません。(こちらは rsync でカレントを引張てきました)

この上に path 関連の警告メッセージ
This is mendex version 2.6f [14-Aug-2009] (euc) (TeX Live 2017).
Scanning dictionary file ./mendbug.dic....done.
Scanning input file mendbug.idx.
Warning: Incomplete first argument in mendbug.idx, line 1....done (0 entries accepted, 0 rejected).
0 entries accepted, 0 rejected.
Nothing written in output file.

2016 との違いは ... スタイルファイルの読み込み場所を変えている、ファイルの読み込みを fgets から mfgets に置き換えているのでその影響?かそれともrebuild 方法に問題があるか検討中。


truss であのような壊れ方(?)をしているように見えるのでどこかにバファーオーバランなどがあるのではと思いつつ問題となった文字列を出したであろう変数を中心に追跡。アスキーさんの原作では配列でしたが xstrdup などの関係から pointer にしているようなのでその辺を中心に追いかけたのですが悪さをするようなコーディングは今の所発見できていません。というのでシステムライブラリも検討の範囲にすべく 2016 を作成した時の FreeBSD のバージョンなどの手がかりも調べているのですが、手持ちの材料だけでは不明です。



和田 勇 への返信

Re: mendexのコンソール出力が変になる

- aminophen の投稿
> mendex の 2016 と 2017 の違い

参考までに,ソースコードレベルの違いについては

「style file 読み込みのタイミングを遅らせた」
→ エラー・警告を出すタイミングで efp が初期化されていないことにより
segmentation fault が発生していたのを修正するため.

「ファイルの読み込みを fgets から mfgets に置き換え」
→ win32 で文字コード推測機能(nkf ベースのコードを ptexenc に含ませて
いる)を sty file 読込にも適用するため.

です.
aminophen への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
アセト アミノフェンさん、解説ありがとうございます。
texlive-yyyymmdd-source/README.2building を参考にして

mkdir texlive-yyyymmdd-source/Work
cd texlive-yyyymmdd-source
../configure --disable-all-pkgs --enable-mendexk -C CFLAGS=-g CXXFLAGS=-g

のようにして rebuild したのですが手順等に不手際があれば教えてください。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
それから 2016 リリース用を作成した時の FreeBSD の OS バージョンがわかれば教えてください。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
> Xを終了させ コンソール で試すこと可能ですか?
Xを終了させるのではなく、Alt+Ctrl+F1 で virtual console に切り替えて試してみました。結果は、「愛上尾」部分がカットされたような出力になりましたが、これはおそらく FreeBSD の virtual console が MSB がオンのバイトの出力を捨てているからそう見えるのだと思います。出力をリダイレクトしてファイルに落とすと、やはり拡張子が「愛上尾」になっていました。

> kterm 上で truss でシステムコールの状況はどうでしたか?
truss というのは知らなかったのですが、調べたいコマンドをまるっとそのまま引数に与えて実行するだけで色々解析してくれるお手軽なツールみたいですね。和田さんの推測通り、上の方で和田さんが引用していたのと同じ出力が得られました。kterm と virtual console 上で truss -o OUTPUTFILE mendex -E ... を実行して得られた結果を添付します。

(以下余談)
> startx するとほぼ素の X なので こちらは xterm でした
KDM 等を使わずに startx で X を始める使い方だと、.xnitrc の最後で startkde を呼ばないと KDE は始まってくれずに素の X になってしまうんじゃないかと思います。少なくとも、数年前に FreeBSD 上で KDE を使ってた時はそうでした。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
0)ゴミが混入するのに .ilg のファイルに書き込まれているのは、ファイル名の変数は open の時に使用するだけで以降はその時割り当てられたファイルポインタを使うので、今回のような障害がおきても所定のファイルに書き込めているのだと思います。(ソースは見ていませんが)

ニコラスさんからのサジェスションです。もしゴミが気になるなら -t ログファイル とログファイルを明示したらどうでしょうかとのこと。

以下は閑話休題です。

1)そうか virtual console も使えるんだった。通常は6つくらい動いていますしね。
2)linux だとちょっと違うけど strace とかのトレースプログラムを使います。
実行中のプロセスもキャッチアップトレースできますし。
mac は dtrussらしいのだが思い通りの結果が出てこない :-( 修行が足りないので使い方が悪いだけ。solaris も同様だったかな。
3) そういえばちょっと前に CentOS 7 の gnome3 / gnome classic / kde / 他の切り替えでご指摘のことやったのを思い出しました。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- t tk の投稿
ざざっとソースを眺めてみました。

現在のソースでいうと
log fileのオープンはソースの280行目。
「1 errors, written in mendbug.愛上尾.」の表示はソースの344行目。
同じ logfile という変数の文字列を使っています。
280行目と344行目の間にlogfileを書き換えることはしていません。

おかしいのは拡張子の表示だけで、実際には mendbug.ilg というファイルができています。
という現象が不思議です。
どこかで logfile のバッファーを壊すような現象が発生していることになります。
危険な香りがします。

t tk への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
中間報告を書いていたらちょっとおかしなことに気がつきましたので、先に書きます。 MacOS と FreeBSD での違いですが ...

1 errors, written in mendbug.ilg. <== MacOS
1 errors, written in mendbug... <== FreeBSD rebuild したやつ使用

suffix 「.ilg」 の文字列が壊されている。さてどこかこれから調べます。

以下は、中間報告で書きかけたつぶやきです。おひまでしたら呼んでください。

1) アセト アミノフェンさん、Nikola さんには先ほどメールしました.通じるといいのですが。

2)rebuild は ../configure --enable-mendexk -C CFLAGS=-g CXXFLAGS=-g MAKE=gmake でできるようになりました。
#gnu make が必要だと警告が出ていました :-(
#全部やろうとすると xdvik だけ失敗しますのでそれだけ disable すれば良いのですが mendexk だけ指定でも今回のケースは良いですね。

3) symbolic debug もやったのですがデバッグに必要な情報が書き込まれるので思ったような結果が出ていません。

4)TL2017 でエラーさえも出ないと報告したのは、和田の操作ミスでした。手順通り実施すると TL2016 と同じになりました。

5) ソースを見ていて input_line2 の戻り値が long に変更になっているのに mendex では int のままです。今の所は大丈夫だと思いますが、将来のため手を入れておいた方が良いです。
#他にも手を入れておいた方が良い点がたくさんありますがとりあえず見なかったことにしたい :-(

6) t tk さん、おっしゃる通り変数 logfile の書き換えは明示的には行われてはいませんね。idx ファイルを読み込むバファーをチェックしましたが、64K もあり、今回のテストでバファーオーバーランの可能性は少ないと感じていますがこの idx ファイルを読み込む idxread(fread.c) ですが巨大な行数の関数でかつ goto 文がいっぱいいっぱいあるので追いかけ切りません :-(。文字コードのハンドリングだから仕方がないのかな ...

また危険な香りは私もアセト アミノフェンさんのTL2017改変理由で「未初期化」とあったので感じており、かつとても気になって調べていますが、上記理由もあり正直めげています。






和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
今にNikola さんから返事が来た。再現するそうです。向こうでも何か調査してくれているようですが。。。。

dicread という関数がコールされファイル名をKPATHSEA とか KPSE 絡みの共通関数を使ってチェックした時に logfileというグローバル変数が壊れます。

なぜかDEBUG のタグのところのマクロらしきところを実行した時に壊れるみたいです。眠いので、追跡中断しますが、gdb で追いかけた情報を提供しておきます。おかしくなっているところは共通関数部分なのでそれ自体が悪いというより KPATHSEA とか KPSE の情報が不足しているのかもしれません。

(gdb) n
431 cache (kpse, elt, ret);
(gdb) p
$154 = 0x800e15218 "mendbug.ilg" <== ここまでは OK

(gdb) n
434 if (KPATHSEA_DEBUG_P (KPSE_DEBUG_EXPAND)) <== 問題箇所実行

(gdb) p
$155 = 0x800e15218 "mendbug.." <== 壊れてしまった

(gdb) list === ソースリスト情報
list
429 /* Remember the directory list we just found, in case future calls are
430 made with the same ELT. */
431 cache (kpse, elt, ret);
432
433 #ifdef KPSE_DEBUG <=== なんで????
434 if (KPATHSEA_DEBUG_P (KPSE_DEBUG_EXPAND)) <== これ実行した時
435 {
436 DEBUGF1 ("path element %s =>", elt);
437 if (ret)
438 {

(gdb) w <==関数コールトレース情報です
#0 kpathsea_element_dirs (kpse=0x642680 <kpse_def_inst>, elt=0x800e56600 ".") at ../../../texk/kpathsea/elt-dirs.c:434
#1 0x000000000041a5ad in path_search (kpse=0x642680 <kpse_def_inst>, path=0x420b9e ".", name=0x800e1cb40 "mendbug.dic", must_exist=1, all=0)
at ../../../texk/kpathsea/pathsearch.c:291
#2 0x000000000041a7b2 in search (kpse=0x642680 <kpse_def_inst>, path=0x420b9e ".", original_name=0x800e170b0 "mendbug.dic", must_exist=1, all=0)
at ../../../texk/kpathsea/pathsearch.c:376
#3 0x000000000041adb4 in kpathsea_path_search (kpse=0x642680 <kpse_def_inst>, path=0x420b9e ".", name=0x800e170b0 "mendbug.dic", must_exist=1)
at ../../../texk/kpathsea/pathsearch.c:577
#4 0x000000000041ae3f in kpse_path_search (path=0x420b9e ".", name=0x800e170b0 "mendbug.dic", must_exist=1)
at ../../../texk/kpathsea/pathsearch.c:598
#5 0x000000000040956d in KP_find_file (info=0x641dd0 <kp_dict>, name=0x800e170b0 "mendbug.dic") at ../../../texk/mendexk/kp.c:40
#6 0x0000000000401eb4 in dicread (filename=0x800e170b0 "mendbug.dic") at ../../../texk/mendexk/convert.c:74
#7 0x000000000040a46e in main (argc=5, argv=0x7fffffffea28) at ../../../texk/mendexk/main.c:303
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
たくさんの情報を流してしまい申し訳無いです。
昨夜レポートした情報に誤りがありました。

> 431 cache (kpse, elt, ret);
> 432
> 433 #ifdef KPSE_DEBUG <=== なんで????
> 434 if (KPATHSEA_DEBUG_P (KPSE_DEBUG_EXPAND)) <== これ実行した時
> 435 {

とレポートしましたが、実際は 431 行目の cache の中の xstrdup で kpse の cache の key を設定する際に発生しているようです。
こんな基本中の基本なのところでおかしくなっているのでで kpse の設定内容に問題がありそうです。なお、この症状は TL2017 でも発症しています。

長くなりますが、収集し直した情報をレポートします。

★ cache のソースリスト情報
68 static void
69 cache (kpathsea kpse, const_string key, str_llist_type *value)
70 {
71 kpse->cache_length++;
72 XRETALLOC (kpse->the_cache, kpse->cache_length, cache_entry);
73 kpse->the_cache[kpse->cache_length - 1].key = xstrdup (key);
74 kpse->the_cache[kpse->cache_length - 1].value = value;
75 }

★73行目を実行する前の左辺の情報
(gdb) p kpse->the_cache[kpse->cache_length - 1]
$1 = {key = 0x800e17150 "/nonesuch", value = 0x800e151b8}

★73行目を実行すr前のグローバル変数 logfile の値
(gdb) p logfile
$2 = 0x800e15218 "mendbug.ilg"

(gdb) n
73 kpse->the_cache[kpse->cache_length - 1].key = xstrdup (key);
(gdb) p
$4 = 0x800e15218 "mendbug.ilg"

★73行目実行
(gdb) n
74 kpse->the_cache[kpse->cache_length - 1].value = value;

★73行目実行後の logfile は壊れている
(gdb) p
$5 = 0x800e15218 "mendbug.."

★73行目実行後の左辺
(gdb) p kpse->the_cache[kpse->cache_length - 1]
$6 = {key = 0x800e15220 ".", value = 0x0}

/nonesuch となっていたのが . に置き換わっている
アロケートした key のアドレスが logfile が使っている一部になっている

★関数トレース情報
(gdb) where
#0 cache (kpse=0x642680 <kpse_def_inst>, key=0x800e56600 ".", value=0x800e15208) at ../../../texk/kpathsea/elt-dirs.c:74
#1 0x000000000041f14e in kpathsea_element_dirs (kpse=0x642680 <kpse_def_inst>, elt=0x800e56600 ".") at ../../../texk/kpathsea/elt-dirs.c:431
#2 0x000000000041a5ad in path_search (kpse=0x642680 <kpse_def_inst>, path=0x420b9e ".", name=0x800e1cb40 "mendbug.dic", must_exist=1, all=0)
at ../../../texk/kpathsea/pathsearch.c:291
#3 0x000000000041a7b2 in search (kpse=0x642680 <kpse_def_inst>, path=0x420b9e ".", original_name=0x800e170b0 "mendbug.dic", must_exist=1, all=0)
at ../../../texk/kpathsea/pathsearch.c:376
#4 0x000000000041adb4 in kpathsea_path_search (kpse=0x642680 <kpse_def_inst>, path=0x420b9e ".", name=0x800e170b0 "mendbug.dic", must_exist=1)
at ../../../texk/kpathsea/pathsearch.c:577
#5 0x000000000041ae3f in kpse_path_search (path=0x420b9e ".", name=0x800e170b0 "mendbug.dic", must_exist=1)
at ../../../texk/kpathsea/pathsearch.c:598
#6 0x000000000040956d in KP_find_file (info=0x641dd0 <kp_dict>, name=0x800e170b0 "mendbug.dic") at ../../../texk/mendexk/kp.c:40
#7 0x0000000000401eb4 in dicread (filename=0x800e170b0 "mendbug.dic") at ../../../texk/mendexk/convert.c:74
#8 0x000000000040a46e in main (argc=5, argv=0x7fffffffea30) at ../../../texk/mendexk/main.c:303

以上です




和田 勇 への返信

Re: mendexのコンソール出力が変になる

- Akira Kakuto の投稿
和田さん,

関係ないとは思いますが,添付のパッチ (convert.c.diff)
を現在最新の TeX Live ソースにあてて,試していただけますか?
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
Kakuto さんへ
お昼休みか、帰宅後試して見ます。

修正の内容は、自転車通勤途中で原因を考えていたのと道誉の対処ですね。
logfile(filename)は途中で realloc されてしまうケースがあるので最初にヒープからアロケートされた領域が一旦ヒープに返されるケースが発生し、別のところで再利用されるため、今回の障害が発現したと考えています。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
Kakuto さんへ、残念ながらダメでした。

fullname などに置き換えようとしていた filename は mendbug.dic などという .dic ファイル名で、書き換わってしまうのは、グローバル変数 logfile の mendbug.ilg なので。


おそらく kpse の情報を操作する構造体領域の領域を調べる必要があると思っています。この構造体を作成するとき何かが紛れ込んだのでしょう。

TL2017 TL2016 両方でチェックしたログを添付しますので参考にしてください。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- Akira Kakuto の投稿
mendex が必要とする変数が,配布 texmf.cnf に無いので,
KP_entry_filetype(KpathseaSupportInfo *info)
がうまく働いていないのだと思います。
既に存在するディレクトリを指定したほうが良いでしょうから

texmf.cnf の
% Makeindex style (.ist) files.
INDEXSTYLE = .;$TEXMF/makeindex//

の次に
% mendex dictionary (.dict) files.
INDEXDICTIONARY = .;$TEXMF/makeindex//

を記述して下さい。実際の辞書は カレントディレクトリや
$TEXMF/makeindex/mendexdic を作成して
$TEXMF/makeindex/mendexdic//
などに置くと良いでしょう。

これでよいことがわかれば,TeX Live の texmf.cnf を
変更します。
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- Akira Kakuto の投稿
Nikola さんのところでは,texmf.cnf の変更で OK になった
と報告がありました。
いずれにしても, texmf.cnf は変更しておいた方が良いので,
変更しておきます。
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
realloc 云々という話だの今朝のつぶやきは忘れてください。

原因がわかりました。
main.c の 271 行目で logfile を収めるための領域を確保しようとするのですが計算ミスで領域不足が原因です。今回の場合は、12 バイト分最低限必要ですが 5バイトしか要求していませんでした。FreeBSD の場合はおそらく 8バイトバウンダリでリクエストが処理されるので、壊れる内容も理屈通りです。
アドホックな習性でも良いのですが、この部分だけになりますがリファクタリングしておいた方が良いと思うのでパッチはもうちょっと待っててください。

エビデンスです。

271: logfile=xmalloc(strlen(idxfile[0]+6));

(gdb) p idxfile[0]
$6 = 0x800e17160 "mendbug.idx"

(gdb) p strlen(idxfile[0]+6)
$7 = 5

5バイト要求したので8バイト分ヒープ領域使うよう管理される

(gdb) p idxfile[0]+6
$8 = 0x800e17166 "g.idx"

それと 279 行目は拡張子がない場合ですが領域破壊するケースがあります。


和田 勇 への返信

Re: mendexのコンソール出力が変になる

- Akira Kakuto の投稿
どうもありがとうございます。単に,

strlen(idxfile[0]+6) /* これはおかしい */



strlen(idxfile[0]) + 6

に変更することで大丈夫ではないでしょうか?
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- t tk の投稿
ありがとうございます。
どうやら TeX Live svn r42491 で去年の11月ごろ私が入れてしまったバグのようです。

logfile=xmalloc(strlen(idxfile[0]+6));
の代わりに
logfile=xmalloc(strlen(idxfile[0])+6);
が正解だと思います。
もちろん別解もあると思います。

さて、どうしましょう。和田さんのご提案を待ちましょうか。

t tk への返信

Re: mendexのコンソール出力が変になる

- Akira Kakuto の投稿
mendex, upmendex の現在の主メンテナは ttk さんなので,
ttk さん訂正をお願い致します。
和田さん (I. Wada san) の詳細な分析に感謝します。
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- Akira Kakuto の投稿
> ttk さん訂正をお願い致します。

抜けていました。
和田さんのご提案を待ったうえで
ttk さん訂正をお願い致します。
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
だいたいできたのですが、該当箇所の上にまったく同じ構造のものがあるので 以下の手順をdefine マクロ化してるのですが note: ... を如何に消そうか手こずってます :-(。
rindex と printf の %*.* を利用しています。

+ if (!logfile && (idxcount - fsti > 0)) {
+ char *extp = rindex(idxfile, '.');
+ int length = strlen(idxfile);
+
+ if ( extp )
+ length -= strlen(extp);
+
+ logfile = (char *)xmalloc(length + sizeof(".ilg") + 1);
+ (void)sprintf(logfile, "%*.*s.ilg", length, length, idxfile);
}
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
お待たせしました。ようやく公開できるものができました。
概略はこの前の投稿と同じです。 idxfile は実際は idexfile[0] です。

処理系によって rindex が使えないとのことですので strchar に置き換えました。
また、警告メッセージの消去に手間取りましたが、テストプログラムのみの話でした。strlen などを使うとき string.h を読み込まないと、その関連の警告に芋づるのようになって出現していました。

それから sprintf で拡張子を付け直した時、変換した文字列数を把握・比較しておけば今回のトラブルも未然に防げたのですが、マッチしなかった時どうするか不明でしたので void してあります。 length + sizeof(".ilg") のような値と比較すれば良いだけですが。

ではパッチを添付しますので、ご検討ください。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
パッチ作成にあたってテスト用に作成したものを添付します。
gcc でコンパイルしたあと、a.out file.idx hogehoge.idx などとしていただければ、拡張子が取り替えられたさまがわかるようになっています。

なお、テスト用のプログラムでは idxfile は char * ですが 実際は char** なので 先ほど投稿したパッチでは idxfile[0] となっています。
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- t tk の投稿
xmallocの長さの問題に対しとりあえず
TeX Live svn にコミット r43700 しました。
別のご提案があれば、お願いします。

和田さん:
5) ソースを見ていて input_line2 の戻り値が long に変更になっているのに mendex では int のままです。今の所は大丈夫だと思いますが、将来のため手を入れておいた方が良いです。
#他にも手を入れておいた方が良い点がたくさんありますがとりあえず見なかったことにしたい
具体的なご提案があれば、お願いします。
パッチでも良いですし、GitHubの https://github.com/texjporg/tex-jp-build を利用しても良いです。

t tk への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
ちょっとだけ上げておきます。
1) const 宣言変数を左辺で代入するような記述はしない方が良い。
2) dicread でですが
a) 同じパターンのエラー処理が沢山あるので、関数か define マクロにした方が良い
b) 大きなブロックでのループ変数は i j など1文字変数ではなく有意な名前で使用してほしい。デバッグする時1文字だと前後に英字でない条件をつけねばならずデバッグもし辛い。
c) goto 無くしたい ... だとすると熟読してスクラッチから書き換えになっちゃうな ... ruby python perl や正規表現がめちゃ高速だと言われる rustで書き換えというのも一考かな。

# 上記は今まで書いてきた自分のプログラムの反省でもある :-(
# GitHubの方後で覗いてみます。


和田 勇 への返信

Re: mendexのコンソール出力が変になる

- t tk の投稿
mendex というソフトウェアは、歴史的にはASCII media works さんが2009年まで開発してこられ、
土村さんのptexenc導入や
TeX Liveへの取り込み後Peter Breitenlohnerさん、角藤さんによるリファクタリングや少々の機能追加を経ていますが、
基本的には 2009年8月のASCIIさんのソースから内容が変わっていないと言えると思います。
機能面では成熟し、枯れたソフトウェアだと思います。
mendex を現在使っているユーザーさん、または将来のユーザーさんにとって、
動作が変わらない、安定性が価値になると思います。
mendex のメンテナンスはそれを守るべきだと私は考えています。

和田さんが mendex を書き換えたいと思う動機は何でしょうか?
ソースコードを読みやすく変更したい、ということについては、現時点ではそれをする必然性が私には感じられません。
今回の件は私のミスが原因で問題が出ましたが、本来デバッグが必要になるケースはまれだと思います。

あるいは、何か機能面で、mendexの現在の動作の不満な点の修正や機能追加など、目指すべき方向をお持ちでしょうか?
スクラッチから書き換え等大きな変更をするなら、mendexの名前でやるべきではなく別のソフトウェアとしてやるべきと考えます。
拙作のupmendexも、多言語対応という目的のためmendexからforkしたソフトウェアです。
t tk への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
まず冒頭に謝ります。「mendex を書き換えたい云々」というのは、書きすぎ・言い過ぎでした。補足するならば、「もし和田が dicread に機能追加などの必要性が生じ、かなりの変更しなければならなくなったら ...」というような要件が発生したら書き換えたいな ... との思いでした。

原作者は大変苦労されていると思います。「諸悪の元だと言われる goto 文」を多用しているように見えますが、飛び込み先は「一つ」にしています。一つにしていることでスパゲッティにしないぞ、という心意気を感じていました。

でも、冒頭で補足したような事態が生じたら、私は後世の人にメンテナンスをしてもらうために re-write を含むリファクタリング行うと思います。
名前も少なくとも mendex2 のように「機能追加したので fork/branch したぞ」という意思表示はします。


ちょっと話題が逸れるかもしれませんが、私も t-tk さんのメンテナンスの方針には異論ありませんが、今回敢えてパッチ作成を名乗り出たのは経緯から私なりの修正に対する考え方を述べさせていただきます。

★(原作者・メンテナーが伝えたいと思っている)コーディングの意味するところを考える

この話題の別のところでも記しましたが、「6」というマジックナンバーが「5」だったら、あるいはその理由がコメントで記述され妥当であれば、kakuto さんが当初提案されたような修正が最も量が少なくなるが故テストもほぼ不要なるので、パッチ作りはメンテナーにきっと一任したでしょう。

★半年後の自分(=他人・後世の人)が容易に機能を理解できるように記述する

今回の障害箇所のすぐ下のコーディングを見たら、そこでアロケートした領域に対して sprintf で書き込んだにもかかわらずその結果をチェックしていない・拡張子がない時何かおかしい ... と考え「後世のメンテナーのため書き換えた方が良い」と判断し、採用されなくても良いから、バグ発見の一報とともにこのブロックだけのリファクタリングパッチ作成を敢えて宣言した次第です。



PS 「土村さん」懐かしいお名前。彼の仕事で LaTeX 環境構築が非常に楽になったと記憶しています。Mac でのインストールスクリプトの不具合などを一度か二度報告させていただいた。
t tk への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
今回、ソースを見始めた時からとても気になっているものにマジックナンバー「6」があります。

Kakuto さんから以下のような修正案があったのですが

logfile=xmalloc(strlen(idxfile[0])+6);

大雑把にえいやであればそれはそれでいいのですが、気になります 6 が。

拡張子 .ilg ないし .ind に書き換えるので元の basename + 4 + 1 で良いのでは?
5 だったら「はい、それでお願いします..」だったかもしれません。

大きく確保しておけば安全なのですが、なぜ 6 という数字を使われているかおひまがあれば教えていただきたいです。
和田 勇 への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
詳細な調査ありがとうございました。原因が解明されたようで何よりです。近日中にバイナリが更新されるでしょうから、それを待って結果を報告します。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
本日、TeXLive2017をインストールして試したところ、期待通り正常に動作するようになっていました。ありがとうございました。
Akira Kakuto への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
私の方にも Nikola さんから一報が届いています。
向こうで確認されているので、和田はこの検証は行わないで良いですよね。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 井汲 景太 の投稿
ところで、Linux や他の *BSD 系での再現性はどうでしょうか。検証していただける方がいらっしゃれば幸いです。
井汲 景太 への返信

Re: mendexのコンソール出力が変になる

- 和田 勇 の投稿
懸念されている他の処理系ですが ... メジャーどころの CentOS 7.3.1611 と ubuntu 16.10 では問題なく処理されています。
NetBSD OpenBSD は時間があったら試しますけど誰かやってほしいな。