Ticket #25781

MALLOC_PERTURB_ が 0 でないときに eptex が異常動作

Open Date: 2011-07-22 14:02 Last Update: 2011-08-09 17:38

Reporter:
Owner:
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
2

Details

環境変数 MALLOC_PERTURB_ が 0 でないとき,eplatex.fmt が正常に作成されません. 北川の環境 (Gentoo, amd64) では,MALLOC_PERTURB_=40 の場合に,Segmentation fault が発生しました:

h7k /tmp $ MALLOC_PERTURB_=40 eptex -ini -progname=platex -jobname=eplatex platex.ini
This is e-pTeXk, Version 3.1415926-p3.1.11-100420 (utf8.euc) (TeX Live 2010) (INITEX)
 restricted \write18 enabled.
(略)
(/opt/texlive/p2010/texmf-dist/tex/platex/base/plcore.ltxSegmentation fault
このバグは TeX Live 2011 に収録されているバージョン(-110415)においても,TeX Live 2010 対応の -110315 においても発生します.

Ticket History (3/7 Histories)

2011-07-22 14:02 Updated by: h7k
  • New Ticket "MALLOC_PERTURB_ が 0 でないときに eptex が異常動作" created
2011-07-22 14:13 Updated by: h7k
Comment

最小の再現するソースは次です(-ini で実行してください)

\catcode`\{=1\catcode`\}=2
%\jfont\min=min10 \min
\hbox{\char\euc"A1A1}
\end

  • 例えば MALOC_PERTURB_=137 では,
    Overfull \vbox (30326.46274pt too high) detected at line 4
    
    などと,異常な寸法となります.
  • 2行目のコメントを外すと,症状は起こりません.「現在の和文フォント」が未設定(\nullfont)の場合に限られる?.

調べたところ,pTeX に潜在的に埋まっていたバグのように思えてきました. TeX Live ソース中の texk/web2c/texmfmem.h のところで,

#if !defined(Aleph) && !defined(epTeX)
#if !defined(Aleph) && !defined(epTeX) && !defined(pTeX)
に置換して pTeX をビルドしたら, pTeX でも同じような症状が起きることを確認しました.

2011-07-22 22:58 Updated by: h7k
Comment

調べてみた所,以下のようになっているようです:

  • (e-)pTeX では,何も和文フォントが読み込まれていない時の「現在の和文フォント」の値は \nullfont.
  • しかし,この \nullfont は,和文用フォントとしては正しくないデータ構造(欧文用).
  • (ここから推測)前ソース 2 行目の「\hbox{\char\euc"A1A1}」実行時には,
    1. EUC で A1A1 番にあたる文字のノードが作られ,
    2. その文字の寸法が測定され,\hbox{} の大きさが定まる.
しかし,2. の過程で(\nullfont はあくまでも欧文フォントなので)正しくない参照が行われ, 結果として(malloc されたまま)未初期化の値を読みにいくなどしてしまい,不正な結果を得る.

とりあえず .fmt を作成させる際の応急処置として, 和文フォントが \nullfont であることを防ぐために,

--- /opt/texlive/2011/texmf-dist/tex/platex/config/platex.ini	2010-05-19 03:19:00.000000000 +0900
+++ /tmp/platex.ini	2011-07-22 22:37:56.561954357 +0900
@@ -11,6 +11,7 @@
 \endgroup \platexTMP
 %
 %%  \scrollmode
+\font\min=min10\min\let\min=\relax
 \input platex.ltx
 %
 \begingroup  \makeatletter%
などと,先に和文フォントを適当に読み込んでおくという策があります. (私の環境では,これでうまくいってるようです)

本来ならば,primitive として \nulljfont とかいう「仮想的な和文フォント」をきちんと定義しておくのが良いかと思います.この方向でパッチを書いてみます.

2011-07-24 20:55 Updated by: h7k
  • Details Updated
  • Resolution Update from None to Fixed
Comment

\nulljfont を定義する方法だと,TRIP test にある

 \fontdimen12\nullfont=13pt % give the null font more parameters
で失敗するので,ptex-20110723-nullfont.ch では 「\nullfont の和文文字 / JFMグルーは出力しない」という方針で書いてみました.

この ptex-20110723-nullfont.ch では,MALLOC_PERTURB_ が 0 でなくても e-pTeX は正常終了するようです(終了時ステータスしか見てないですが)

2011-08-09 17:38 Updated by: h7k
  • Ticket Close date is changed to 2011-08-09 17:38
  • Status Update from Open to Closed

Attachment File List

  • ptex-20110722-nullfont.ch(2KB)
    • パッチ案その1.eptex.am を書き換えて,eptex-base.ch (TL10) や eptexdir/etex.ch1 (TL11) の直後にこれが適用されるようにして使ってみて下さい.
  • ptex-20110723-nullfont.ch(1KB)
    • パッチ案その2.上のパッチでは TRIP テストに失敗することへの修正.

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login