[
https://issues.apache.org/jira/browse/PDFBOX-4963?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17623347#comment-17623347
]
Maison edited comment on PDFBOX-4963 at 10/24/22 6:52 PM:
----------------------------------------------------------
Hello,
This bug has somehow been fixed by overriding TrueTypeFont.finalize() method.
From my observations, although not optimal, this works (at least with jdk11).
See also https://issues.apache.org/jira/browse/PDFBOX-5362
was (Author: momaison):
Hello,
This bug has somehow been fixed by overriding finalize() method. From my
observations, although not optimal, this works (at least with jdk11).
See also https://issues.apache.org/jira/browse/PDFBOX-5362
> TTF file leakage in font cache
> ------------------------------
>
> Key: PDFBOX-4963
> URL: https://issues.apache.org/jira/browse/PDFBOX-4963
> Project: PDFBox
> Issue Type: Bug
> Components: PDModel
> Affects Versions: 2.0.21
> Reporter: Maison
> Priority: Major
>
> We observe many TTF opened files in our production server, which result in
> exhausting file descriptors.
> We have checked and rechecked that every PDDocument is properly closed (try
> with resource everywhere).
> By looking at pdfbox source code, I suspect 2 problems in FontCache and in
> FileSystemFontProvider
> 1 - FontCache
> In FontCache, a map keeps SoftReference<FontBoxFont> as values.
> IIUC for TTF fonts, the values are instances of
> org.apache.fontbox.ttf.TrueTypeFont. Such instances have a TTFDataStream
> member, which is RAFDataStream (so there is an opened file).
> Problem is that if the soft reference is cleared by GC, we can suppose the
> TrueTypeFont objects are GCed (is that guaranteed?) ; but what about the
> RAFDataStream sub-object ? There is no RAFDataStream.close() in TrueTypeFont
> finalizer
> 2 - FileSystemFontProvider
> There seems to be a TOCTOU-like race condition when a font is needed. Code
> looks like below (simplified) :
> @Override
> public FontBoxFont getFont()
> {
> FontBoxFont cached = parent.cache.getFont(this);
> if (cached != null) {
> return cached;
> }
> FontBoxFont font = ... // instantiate font
> parent.cache.addFont(this, font); // <--- not thread safe ?
> return font;
> }
> The font, if not in cache, is instantiated and added into cache. But two
> threads can do that at the same time, and the last addFont() wins. So the
> first SoftReference<FontBoxFont> object is now eligible to GC; but the
> FontBoxFont has not been closed.
> This problem is probably less frequent.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]