play1 icon indicating copy to clipboard operation
play1 copied to clipboard

NPE upon captcha generation using Java 11

Open sant0s opened this issue 6 years ago • 1 comments

Description

Play! version: 1.5.3 Java version: openjdk version "11.0.5" 2019-10-15 OS: Ubuntu 18.04.3 LTS

Consider a Play app consisting of a controller that generates a captcha.

Create a test app

play new test

and change the application controller to

package controllers;

import play.mvc.Controller;
import play.libs.Images;

public class Application extends Controller {

    public static void index() {
        Images.Captcha captcha = Images.captcha();
        renderBinary(captcha);
    }

}

start play

play run

and open the browser at http://localhost:9000/

Although the captcha is rendered correctly, logs show an NPE being thrown:

09:21:41,358 WARN  ~ You're running Play! in DEV mode
09:21:41,418 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...
~ Server is up and running
09:21:46,206 INFO  ~ Application 'test' is now started !
java.lang.NullPointerException
	at jj.play.ns.com.jhlabs.image.TransformFilter.imageComplete(TransformFilter.java)
	at java.desktop/sun.awt.image.OffScreenImageSource.produce(OffScreenImageSource.java:193)
	at java.desktop/sun.awt.image.OffScreenImageSource.addConsumer(OffScreenImageSource.java:66)
	at java.desktop/sun.awt.image.OffScreenImageSource.startProduction(OffScreenImageSource.java:80)
	at java.desktop/java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:184)
	at java.desktop/sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:732)
	at java.desktop/sun.awt.image.ToolkitImage.addWatcher(ToolkitImage.java:221)
	at java.desktop/sun.awt.image.ToolkitImage.getWidth(ToolkitImage.java:110)
	at java.desktop/sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3407)
	at jj.play.ns.nl.captcha.util.ImageUtil.applyFilter(Unknown Source)
	at jj.play.ns.nl.captcha.gimpy.RippleGimpyRenderer.gimp(Unknown Source)
	at play.libs.Images$Captcha.check(Images.java:423)
	at play.libs.Images$Captcha.read(Images.java:406)
	at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2146)
	at org.apache.commons.io.IOUtils.copy(IOUtils.java:2102)
	at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2123)
	at play.mvc.results.RenderBinary.copyInputStreamAndClose(RenderBinary.java:207)
	at play.mvc.results.RenderBinary.renderInputStream(RenderBinary.java:197)
	at play.mvc.results.RenderBinary.apply(RenderBinary.java:157)
	at play.mvc.ActionInvoker.invoke(ActionInvoker.java:201)
	at play.server.PlayHandler$NettyInvocation.execute(PlayHandler.java:289)
	at play.Invoker$Invocation$1.apply(Invoker.java:319)
	at play.Invoker$Invocation$1.apply(Invoker.java:315)
	at play.db.jpa.JPA.withTransaction(JPA.java:349)
	at play.db.jpa.JPA.withinFilter(JPA.java:238)
	at play.db.jpa.JPAPlugin$TransactionalFilter.withinFilter(JPAPlugin.java:306)
	at play.Invoker$Invocation.withinFilter(Invoker.java:298)
	at play.Invoker$Invocation.run(Invoker.java:315)
	at play.server.PlayHandler$NettyInvocation.run(PlayHandler.java:266)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

Expected Behavior

Ideally, the captcha would be generated correctly without the NPE being thrown.

Actual Behavior

Every time a captcha is generated, an NPE is thrown.

Reproducible Test Case

The actual behaviour is consistently reproducible by following the above-mentioned steps. The behaviour is not reproducible when using Java 8 i.e. the captcha is generated and no NPE is thrown.

sant0s avatar Jan 13 '20 09:01 sant0s

Have the same issue. This is probably due the usage of sun libraries for image generation which are not available in openjdk anymore. Will this change in future or is this a "won't fix"?

With openjdk 1.8 i get this as error message: Caused by: javax.imageio.IIOException: Invalid argument to native writeImage 637.at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method) 638.at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:1067) 639.at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:363) 640.at com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:162) Higher openjdk versions return just npe.

jarlucmat avatar Sep 17 '20 12:09 jarlucmat