概要
- 2004年生まれの編集長が Enlightenment E16 ウィンドウマネージャを日常的に使用
- 2006年から存在する重大バグ の修正過程を解説
- 問題の根本は Newton法の実装ミス に起因
- 修正内容と パッチの詳細 を紹介
- 古いソフトウェアのメリットと サプライチェーンリスク について考察
Enlightenment E16のバグ修正記録
- 編集長は Enlightenment E16 を愛用、テーマ性・軽量性・カスタマイズ性・美しさを評価
- E16は 1997年にCarsten Haitzler によって開発開始、現在も一部コアユーザーに支持される
- コードベースは古く、 技術的負債 が蓄積
- 講義スライド作成中、特定PDFを開くと デスクトップがフリーズ するバグに遭遇
- gdbデバッグ でimlib2のフォントキャッシュに問題があることを特定
- フリーズは再現性が高く、 TextstateTextFitMB関数 の無限ループが原因
問題の詳細と原因
- TextstateTextFitMB はウィンドウタイトルの「…」省略処理を担当
- タイトルが長すぎる場合、 Newton法的な探索アルゴリズム で省略位置を決定
- 本来収束すべきループが、 2つの状態間で永久に振動 し続ける
- 収束判定の許容値が厳しく、 短いタイトルでは問題が発生しない
- Newton法の イテレーション上限が未設定 だったことが主因
修正内容とパッチ
- イテレーション回数を32回に制限、超過時は現在の結果を受け入れる
- nuke_countを1未満にしない、異常な文字列生成を防止
- cw(平均文字幅)を1未満にしない、ゼロ除算を防ぐ
- マルチバイト・ASCII両ループに 対称的な修正 を適用
- パッチ例:
- ループを
for (int iter = 0;; iter++)に変更 if (iter >= 32)で強制終了条件を追加if (nuke_count < 1)やif (cw < 1)の防御コード挿入
- ループを
再現条件
- WM_NAMEが長いウィンドウ で本バグが再現
- 例:「Kickoff.pdf — Introduction to Information Theory Session 1: kickoff & first topic」など
- タイトル幅に対して文字数が多い場合に 省略アルゴリズムが発動
古いソフトウェアとサプライチェーンリスク
- 新しいソフトウェアは新しいバグ も多く、貢献障壁が下がることで品質低下のリスク
- 安定版カーネルでも 不注意なパッチで致命的バグ が混入した例を紹介
- サプライチェーン攻撃 や意図的なバックドアの危険性を指摘
- 自分で保守する古いソフトウェアは バグが減少しやすい 利点
- 必要な機能は自分で実装、問題の責任も自分に帰結
- サプライチェーンを持たない安心感 と、最新機能への執着のなさを強調
まとめ
- Newton法の実装ミス が思わぬ不具合を長期放置
- 防御的プログラミング とイテレーション制限の重要性
- 古いソフトウェアの自己保守 の価値と、サプライチェーンリスクへの警鐘