3

After upgrading to RestEasy from 4.4.2 to 4.5.2, I got a StackOverflowError when returning a response with an entity InputStream. Returning a basic 10MB stream fails.

Bug reproductible with very basic code:

@Path("/")
public class TestResource {

    @GET
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    @Path("/{size}")
    public Response donwload(@PathParam("size") long size) {
        return Response.ok(new NullInputStream(size)).build();
    }
}

Requesting :

localhost:8000/1000000  ==> OK
localhost:8000/10000000 ==> StackOverflowError

I get :

org.eclipse.jetty.server.HttpChannelOverHttp.handleException(HttpChannelOverHttp.java:488) :  java.lang.StackOverflowError: null
        at org.eclipse.jetty.util.BufferUtil.fill(BufferUtil.java:503)
        at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:791)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.write(HttpServletResponseWrapper.java:153)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$AsyncOperation.work(HttpServletResponseWrapper.java:41)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.queue(HttpServletResponseWrapper.java:219)
        at org.jboss.resteasy.plugins.server.servlet.HttpServletResponseWrapper$DeferredOutputStream.asyncWrite(HttpServletResponseWrapper.java:180)
        at org.jboss.resteasy.util.CommitHeaderAsyncOutputStream.asyncWrite(CommitHeaderAsyncOutputStream.java:94)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.writeTo(ProviderHelper.java:171)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.lambda$writeTo$1(ProviderHelper.java:172)
        at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.writeTo(ProviderHelper.java:172)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.lambda$writeTo$1(ProviderHelper.java:172)
        at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.writeTo(ProviderHelper.java:172)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.lambda$writeTo$1(ProviderHelper.java:172)
        ...
        at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:143)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.writeTo(ProviderHelper.java:172)
        at org.jboss.resteasy.plugins.providers.ProviderHelper.lambda$writeTo$1(ProviderHelper.java:172)
        ...
Lotfi
  • 1,205
  • 8
  • 18

2 Answers2

1

I reported the bug https://issues.redhat.com/browse/RESTEASY-2526 and it's been resolved since

Lotfi
  • 1,205
  • 8
  • 18
-1

After debug your problem, I think the there is no problem in restEasy. The root cause is default JVM configure do not allocate enough memory for the stack. If you setup the JVM stack frame size greater than 10M by yourself, the error would not occur.

Below is my configure in my Idea. I setup 16M for stack frame.

enter image description here

The code works fine and 10M can be download

enter image description here

Buddy
  • 11
  • 1
  • 3
  • How about a 1TB file? shoud I define 1GB stack frame? – Lotfi Mar 25 '20 at 13:14
  • @Lotfi According to the code,the write operation is done in inputstream and outputstream. You say that this code works fine in 4.4.2? Right? If so, I think i shoukd i read the code in revision 4.4.2 – Buddy Mar 25 '20 at 13:18