https://issues.apache.org/bugzilla/show_bug.cgi?id=46336
Summary: Synchronization fault in FontInfoFinder
Product: Fop
Version: 0.95
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: fonts
AssignedTo: [email protected]
ReportedBy: [EMAIL PROTECTED]
I have a multi-threaded rendering application. It produced this exception:
java.lang.NullPointerException
at org.apache.fop.fonts.autodetect.FontInfoFinder.find(FontInfoFinder.java:172)
at
org.apache.fop.render.PrintRendererConfigurator.addFontInfoListFromFileList(PrintRendererConfigurator.java:233)
at
org.apache.fop.render.PrintRendererConfigurator.buildFontListFromConfiguration(PrintRendererConfigurator.java:140)
at
org.apache.fop.render.PrintRendererConfigurator.configure(PrintRendererConfigurator.java:95)
at
org.apache.fop.render.pdf.PDFRendererConfigurator.configure(PDFRendererConfigurator.java:71)
at
org.apache.fop.render.RendererFactory.createRenderer(RendererFactory.java:187)
at org.apache.fop.area.RenderPagesModel.<init>(RenderPagesModel.java:68)
at org.apache.fop.area.AreaTreeHandler.setupModel(AreaTreeHandler.java:127)
at org.apache.fop.area.AreaTreeHandler.<init>(AreaTreeHandler.java:102)
at
org.apache.fop.render.RendererFactory.createFOEventHandler(RendererFactory.java:224)
at org.apache.fop.fo.FOTreeBuilder.<init>(FOTreeBuilder.java:100)
at org.apache.fop.apps.Fop.createDefaultHandler(Fop.java:100)
at org.apache.fop.apps.Fop.<init>(Fop.java:78)
at org.apache.fop.apps.FopFactory.newFop(FopFactory.java:247)
...
I guess the problem is, that you don't synchronize usage of FontCache in this
method:
150 public EmbedFontInfo find(URL fontUrl, FontResolver resolver, FontCache
fontCache) {
151 String embedUrl = null;
152 embedUrl = fontUrl.toExternalForm();
153
154 long fileLastModified = -1;
155 if (fontCache != null) {
156 try {
157 URLConnection conn = fontUrl.openConnection();
158 try {
159 fileLastModified = conn.getLastModified();
160 } finally {
161 //An InputStream is created even if it's not accessed,
but we need to close it.
162 IOUtils.closeQuietly(conn.getInputStream());
163 }
164 } catch (IOException e) {
165 // Should never happen, because URL must be local
166 log.debug("IOError: " + e.getMessage());
167 fileLastModified = 0;
168 }
169 // firstly try and fetch it from cache before loading/parsing
the font file
170 if (fontCache.containsFont(embedUrl)) {
171 CachedFontInfo fontInfo = fontCache.getFont(embedUrl);
172 if (fontInfo.lastModified() == fileLastModified) {
173 return fontInfo;
174 } else {
175 // out of date cache item
176 fontCache.removeFont(embedUrl);
177 }
178 // is this a previously failed parsed font?
179 } else if (fontCache.isFailedFont(embedUrl, fileLastModified))
{
180 if (log.isDebugEnabled()) {
181 log.debug("Skipping font file that failed to load
previously: " + embedUrl);
182 }
183 return null;
184 }
185 }
186
187 // try to determine triplet information from font file
188 CustomFont customFont = null;
189 try {
190 customFont = FontLoader.loadFont(fontUrl, resolver);
191 } catch (Exception e) {
192 //TODO Too verbose (it's an error but we don't care if some
fonts can't be loaded)
193 if (log.isErrorEnabled()) {
194 log.error("Unable to load font file: " + embedUrl + ".
Reason: " + e.getMessage());
195 }
196 if (fontCache != null) {
197 fontCache.registerFailedFont(embedUrl, fileLastModified);
198 }
199 return null;
200 }
201 return fontInfoFromCustomFont(fontUrl, customFont, fontCache);
202 }
203 }
204
When thread1 and thread2 both enter IF at line 170, one can remove the font and
then the other will get null at line 171.
--
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.