Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dvipdfmx] 特定STIX利用dviでクラッシュ(pdf_encoding_new_encoding) #114

Closed
aminophen opened this issue May 14, 2021 · 8 comments
Closed
Labels

Comments

@aminophen
Copy link
Member

転載しておきます。

TeXLIve2019〜2020、trunkのdvipdmfxで落ちるのは確実にわかってるのだが、業務データで完全に作り上げないとエラーにならないという非常にテストも協力も求めづらい状況だ…

STIX混ぜたときにsegvはわかってたので、フォントとpdfencodingのあたりかなというのは推測どおりか。あとはなんでこうなるか…
baseenc[code]が別のメモリ指してるな、なんだこれ

create_encoding_resourcebaseenc ? baseenc->glyphs : NULL でbaseencはあるのだがbaseenc->glyphsがやっぱり壊れているな。encoding->glyphsは全部読めてる
baseenc->glyphsも全部見えないわけじゃなくてちらほら見えてるのがある…謎い

Slack より:

pdfencoding.c の pdf_encoding_new_encoding に問題があります。
RENEW による再確保が実行されると encoding->baseenc が dangling pointer になります。
(16 毎に再確保するので異なるエンコーディングのフォントを 17 以上使うと再現しそう)

@kmuto @h20y6m とりあえず埋もれないようにファイルしておきます。もし後で平田さんにお伝えする時に,参照先として1箇所の方がよいかと思い。

@aminophen
Copy link
Member Author

@kmuto ソース(.tex)の開示は難しいのだと思いますが,DVIに含まれるフォントの一覧は開示可能ですか? 例えば,TeX Live には dviinfoxchkdvifont というツールが入っていて,それを使えば「DVIにから参照されるTFMファイルの一覧」を表示することができます。それがわかれば,フォントパッケージを探って再現例を作れる人が現れるかもしれません。

@kmuto
Copy link

kmuto commented May 15, 2021

ありがとうございます、
dviinfox -fはDVI error: Expected POST_POST command, not 0xf4!となってしまいました。

chkdvifontの結果を問題のあるもの bad.log(lmr利用)、問題のないもの ok.log(代替でほかでも使っているhiramin利用)として書き出しました。
chkdvifont-log.zip

tfm/vfは @munepi さんに作成いただいた業務用のもので、やはり出しにくいところがあります。

@h20y6m
Copy link
Collaborator

h20y6m commented May 15, 2021

異なるエンコーディングのフォントを 17 以上使うと再現しそう

以下のソースで再現できました。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{stix2}
\begin{document}
A quick brown fox jumps over the lazy dog.
\[ \left( \int_0^\infty \frac{\sin x}{\sqrt{x}} dx \right)^2
= \sum_{k=0}^\infty \frac{(2k)!}{2^{2k}(k!)^2} \frac{1}{2k+1}
= \prod_{k=1}^\infty \frac{4k^2}{4k^2 - 1} = \frac{\pi}{2} \]
\[ \mathrm{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathbf{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathit{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathbfit{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathbfscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathsf{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathbfsf{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathsfit{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathbfsfit{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathfrak{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathbffrak{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\[ \mathtt{ABCDEFGHIJKLMNOPQRSTUVWXYZ} \]
\end{document}

@trueroad
Copy link
Member

パッチ作ってみました。
#114 (comment)
が正常に通るようになりました。

--- a/source/texk/dvipdfm-x/pdfencoding.c
+++ b/source/texk/dvipdfm-x/pdfencoding.c
@@ -74,7 +74,7 @@ typedef struct pdf_encoding
   char     *glyphs[256];     /* ".notdef" must be represented as NULL */
   char      is_used[256];
 
-  struct pdf_encoding *baseenc;
+  int baseenc_id;
   pdf_obj  *tounicode;
 
   pdf_obj  *resource;
@@ -100,7 +100,7 @@ pdf_init_encoding_struct (pdf_encoding *encoding)
 
   encoding->tounicode = NULL;
 
-  encoding->baseenc   = NULL;
+  encoding->baseenc_id= -1;
   encoding->resource  = NULL;
 
   encoding->flags     = 0;
@@ -437,7 +437,7 @@ pdf_encoding_new_encoding (const char *enc_name, const char *ident,
     if (baseenc_id < 0 || !pdf_encoding_is_predefined(baseenc_id))
       ERROR("Illegal base encoding %s for encoding %s\n",
 	    baseenc_name, encoding->enc_name);
-    encoding->baseenc = &enc_cache.encodings[baseenc_id];
+    encoding->baseenc_id = baseenc_id;
   }
 
   if (flags & FLAG_IS_PREDEFINED)
@@ -464,9 +464,11 @@ void pdf_encoding_complete (void)
        */
       int with_base = !(encoding->flags & FLAG_USED_BY_TYPE3)
 	              || pdf_check_version(1, 4) >= 0;
+      pdf_encoding *baseenc = (encoding->baseenc_id < 0) ?
+	NULL : &enc_cache.encodings[encoding->baseenc_id];
       ASSERT(!encoding->resource);
       encoding->resource = create_encoding_resource(encoding,
-						    with_base ? encoding->baseenc : NULL);
+						    with_base ? baseenc : NULL);
       ASSERT(!encoding->tounicode);
       encoding->tounicode = pdf_create_ToUnicode_CMap(encoding->enc_name,
 						      encoding->glyphs,

@trueroad
Copy link
Member

@h20y6m さんの再現ソースとパッチを投げておきました
https://tug.org/pipermail/dvipdfmx/2021-May/000270.html

@aminophen
Copy link
Member Author

本題(dvipdfmx)とは関係ないですが

dviinfox -fはDVI error: Expected POST_POST command, not 0xf4!となってしまいました。

の修正版をリリースしました。 aminophen/tex-assort#1

@aminophen
Copy link
Member Author

https://tug.org/pipermail/dvipdfmx/2021-June/000285.html

It's true that with the suggested patch segmentation fault can be avoided, but it is not appropriate one.

@aminophen
Copy link
Member Author

r59525 にて正式な修正が入ったようです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants