This should be fixed in Undertow upstream. The writer will now error out properly on
unmappable characters. You will need to set a response charset of UTF8 (or some other
appropriate charset) in order for this to work correctly.
The only thing I am not sure about is if this should be a fatal error, or if we should
just write the unmappable characters directly to the output.
Stuart
----- Original Message -----
From: "Stuart Douglas" <sdouglas(a)redhat.com>
To: "Wolfgang Knauf" <wolfgang.knauf(a)gmx.de>
Cc: undertow-dev(a)lists.jboss.org
Sent: Wednesday, 28 August, 2013 10:33:35 PM
Subject: Re: [undertow-dev] Deadlock in JSP page on Wilflfy 8.0 Alpha 4 with umlauts
Thanks for reporting this, I will look into it.
Stuart
----- Original Message -----
> From: "Wolfgang Knauf" <wolfgang.knauf(a)gmx.de>
> To: undertow-dev(a)lists.jboss.org
> Sent: Wednesday, 28 August, 2013 10:28:24 PM
> Subject: [undertow-dev] Deadlock in JSP page on Wilflfy 8.0 Alpha 4 with
> umlauts
>
> Hi all,
>
> hope this is the right place and the correct component to post a
> possible Undertow bug:
> I have a simple EAR application, used to test the JavaEE feature of a
> one-to-many-relationship. It contains an EJB jar and a WAR file, bundled
> in an EAR file.
>
> Whenever I add an umlaut in an input field and submit the form, WildFly
> hangs up while processing the request to display the result page (which
> should display a list of my entities). As this happens when generating
> the JSP page, I assume an Undertow issue.
>
> To reproduce:
> 1) deploy "KuchenZutat.ear" to WildFly (it uses the
> "java:jboss/datasources/ExampleDS", so no configuration changes needed).
> 2) browse to "http://localhost:8080/KuchenZutatWeb/"
> 3) Klick "Neu"
> 4) enter something with an umlaut, e.g. "Käsekuchen"
> 5) click OK
> Now the server hangs.
>
> It works when avoiding umlauts.
>
> Here are two stack traces, which I took by debugging the server with
> Eclipse and breaking into debugger at random times. Note that the thread
> name is different in the two stack traces - I took them at different
> server runs.
> "CoderResult.unmappableForLength()" seems to be the place for the
> endless loop.
>
>
> Thread [default task-3] (Suspended)
> owns: CoderResult$2 (id=285)
> HashMap<K,V>.hash(Object) line: not available
> HashMap<K,V>.getEntry(Object) line: not available
> HashMap<K,V>.get(Object) line: not available
> CoderResult$2(CoderResult$Cache).get(int) line: not available
> CoderResult$Cache.access$200(CoderResult$Cache, int) line: not available
> CoderResult.unmappableForLength(int) line: not available
> Surrogate$Parser.unmappableResult() line: not available
> ISO_8859_1$Encoder.encodeBufferLoop(CharBuffer, ByteBuffer) line: not
> available
> ISO_8859_1$Encoder.encodeLoop(CharBuffer, ByteBuffer) line: not available
> ISO_8859_1$Encoder(CharsetEncoder).encode(CharBuffer, ByteBuffer,
> boolean) line: not available
> ServletPrintWriter.write(CharBuffer) line: 58
> ServletPrintWriter.write(char[], int, int) line: 76
> ServletPrintWriterDelegate.write(char[], int, int) line: 96
> JspWriterImpl.flushBuffer() line: 120
> PageContextImpl.release() line: 188
> JspFactoryImpl.internalReleasePageContext(PageContext) line: 115
> JspFactoryImpl.releasePageContext(PageContext) line: 74
> index.jsp line: not available
> index_jsp(HttpJspBase).service(HttpServletRequest, HttpServletResponse)
> line: 69
> index_jsp(HttpServlet).service(ServletRequest, ServletResponse) line: 790
> JspServletWrapper.service(HttpServletRequest, HttpServletResponse,
> boolean) line: 365
> JspServlet.serviceJspFile(HttpServletRequest, HttpServletResponse,
> String, Throwable, boolean) line: 321
> JspServlet.service(HttpServletRequest, HttpServletResponse) line: 254
> JspServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 790
> ServletHandler.handleRequest(HttpServerExchange) line: 87
> FilterHandler.handleRequest(HttpServerExchange) line: 82
> ServletSecurityRoleHandler.handleRequest(HttpServerExchange) line: 54
> ServletDispatchingHandler.handleRequest(HttpServerExchange) line: 36
> SecurityContextAssociationHandler.handleRequest(HttpServerExchange)
> line: 78
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> ServletInitialHandler.dispatchRequest(HttpServerExchange,
> ServletRequestContext, ServletChain, DispatcherType) line: 196
> ServletInitialHandler.dispatchToPath(HttpServerExchange,
> ServletPathMatch, DispatcherType) line: 139
> RequestDispatcherImpl.forward(ServletRequest, ServletResponse) line: 156
> KuchenEdit.jsp line: 40
> KuchenEdit_jsp(HttpJspBase).service(HttpServletRequest,
> HttpServletResponse) line: 69
> KuchenEdit_jsp(HttpServlet).service(ServletRequest, ServletResponse)
> line: 790
> JspServletWrapper.service(HttpServletRequest, HttpServletResponse,
> boolean) line: 365
> JspServlet.serviceJspFile(HttpServletRequest, HttpServletResponse,
> String, Throwable, boolean) line: 321
> JspServlet.service(HttpServletRequest, HttpServletResponse) line: 254
> JspServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 790
> ServletHandler.handleRequest(HttpServerExchange) line: 87
> FilterHandler$FilterChainImpl.doFilter(ServletRequest, ServletResponse)
> line: 130
> JsrWebSocketFilter.doFilter(ServletRequest, ServletResponse,
> FilterChain) line: 136
> ManagedFilter.doFilter(ServletRequest, ServletResponse, FilterChain)
> line: 56
> FilterHandler$FilterChainImpl.doFilter(ServletRequest, ServletResponse)
> line: 132
> JsrWebSocketFilter.doFilter(ServletRequest, ServletResponse,
> FilterChain) line: 136
> ManagedFilter.doFilter(ServletRequest, ServletResponse, FilterChain)
> line: 56
> FilterHandler$FilterChainImpl.doFilter(ServletRequest, ServletResponse)
> line: 132
> FilterHandler.handleRequest(HttpServerExchange) line: 85
> ServletSecurityRoleHandler.handleRequest(HttpServerExchange) line: 56
> ServletDispatchingHandler.handleRequest(HttpServerExchange) line: 36
> SecurityContextAssociationHandler.handleRequest(HttpServerExchange)
> line: 78
> SSLInformationAssociationHandler.handleRequest(HttpServerExchange)
> line: 113
> AuthenticationCallHandler.handleRequest(HttpServerExchange) line: 52
>
ServletConfidentialityConstraintHandler(AbstractConfidentialityHandler).handleRequest(HttpServerExchange)
> line: 45
> CachedAuthenticatedSessionHandler.handleRequest(HttpServerExchange)
> line: 65
> SecurityInitialHandler.handleRequest(HttpServerExchange) line: 70
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> SecurityContextCreationHandler.handleRequest(HttpServerExchange) line: 54
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> ServletInitialHandler.handleFirstRequest(HttpServerExchange,
> ServletChain, ServletRequestContext, ServletRequest, ServletResponse)
> line: 207
> ServletInitialHandler.dispatchRequest(HttpServerExchange,
> ServletRequestContext, ServletChain, DispatcherType) line: 194
> ServletInitialHandler.access$000(ServletInitialHandler,
> HttpServerExchange, ServletRequestContext, ServletChain, DispatcherType)
> line: 72
> ServletInitialHandler$1.handleRequest(HttpServerExchange) line: 128
> HttpHandlers.executeRootHandler(HttpHandler, HttpServerExchange,
> boolean) line: 36
> HttpServerExchange$1.run() line: 628
> XnioWorker$TaskPool(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker)
> line: not available
> ThreadPoolExecutor$Worker.run() line: not available
> Thread.run() line: not available
>
>
>
>
>
>
> Thread [default task-8] (Suspended)
> CoderResult$Cache.access$200(CoderResult$Cache, int) line: not available
> CoderResult.unmappableForLength(int) line: not available
> Surrogate$Parser.unmappableResult() line: not available
> ISO_8859_1$Encoder.encodeBufferLoop(CharBuffer, ByteBuffer) line: not
> available
> ISO_8859_1$Encoder.encodeLoop(CharBuffer, ByteBuffer) line: not available
> ISO_8859_1$Encoder(CharsetEncoder).encode(CharBuffer, ByteBuffer,
> boolean) line: not available
> ServletPrintWriter.write(CharBuffer) line: 58
> ServletPrintWriter.write(char[], int, int) line: 76
> ServletPrintWriterDelegate.write(char[], int, int) line: 96
> JspWriterImpl.flushBuffer() line: 120
> PageContextImpl.release() line: 188
> JspFactoryImpl.internalReleasePageContext(PageContext) line: 115
> JspFactoryImpl.releasePageContext(PageContext) line: 74
> Kuchen.jsp line: not available
> Kuchen_jsp(HttpJspBase).service(HttpServletRequest,
> HttpServletResponse) line: 69
> Kuchen_jsp(HttpServlet).service(ServletRequest, ServletResponse) line: 790
> JspServletWrapper.service(HttpServletRequest, HttpServletResponse,
> boolean) line: 365
> JspServlet.serviceJspFile(HttpServletRequest, HttpServletResponse,
> String, Throwable, boolean) line: 321
> JspServlet.service(HttpServletRequest, HttpServletResponse) line: 254
> JspServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 790
> ServletHandler.handleRequest(HttpServerExchange) line: 87
> FilterHandler.handleRequest(HttpServerExchange) line: 82
> ServletSecurityRoleHandler.handleRequest(HttpServerExchange) line: 54
> ServletDispatchingHandler.handleRequest(HttpServerExchange) line: 36
> SecurityContextAssociationHandler.handleRequest(HttpServerExchange)
> line: 78
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> ServletInitialHandler.dispatchRequest(HttpServerExchange,
> ServletRequestContext, ServletChain, DispatcherType) line: 196
> ServletInitialHandler.dispatchToPath(HttpServerExchange,
> ServletPathMatch, DispatcherType) line: 139
> RequestDispatcherImpl.forward(ServletRequest, ServletResponse) line: 156
> KuchenEdit.jsp line: 43
> KuchenEdit_jsp(HttpJspBase).service(HttpServletRequest,
> HttpServletResponse) line: 69
> KuchenEdit_jsp(HttpServlet).service(ServletRequest, ServletResponse)
> line: 790
> JspServletWrapper.service(HttpServletRequest, HttpServletResponse,
> boolean) line: 365
> JspServlet.serviceJspFile(HttpServletRequest, HttpServletResponse,
> String, Throwable, boolean) line: 321
> JspServlet.service(HttpServletRequest, HttpServletResponse) line: 254
> JspServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 790
> ServletHandler.handleRequest(HttpServerExchange) line: 87
> FilterHandler$FilterChainImpl.doFilter(ServletRequest, ServletResponse)
> line: 130
> JsrWebSocketFilter.doFilter(ServletRequest, ServletResponse,
> FilterChain) line: 136
> ManagedFilter.doFilter(ServletRequest, ServletResponse, FilterChain)
> line: 56
> FilterHandler$FilterChainImpl.doFilter(ServletRequest, ServletResponse)
> line: 132
> JsrWebSocketFilter.doFilter(ServletRequest, ServletResponse,
> FilterChain) line: 136
> ManagedFilter.doFilter(ServletRequest, ServletResponse, FilterChain)
> line: 56
> FilterHandler$FilterChainImpl.doFilter(ServletRequest, ServletResponse)
> line: 132
> FilterHandler.handleRequest(HttpServerExchange) line: 85
> ServletSecurityRoleHandler.handleRequest(HttpServerExchange) line: 56
> ServletDispatchingHandler.handleRequest(HttpServerExchange) line: 36
> SecurityContextAssociationHandler.handleRequest(HttpServerExchange)
> line: 78
> SSLInformationAssociationHandler.handleRequest(HttpServerExchange)
> line: 113
> AuthenticationCallHandler.handleRequest(HttpServerExchange) line: 52
>
ServletConfidentialityConstraintHandler(AbstractConfidentialityHandler).handleRequest(HttpServerExchange)
> line: 45
> CachedAuthenticatedSessionHandler.handleRequest(HttpServerExchange)
> line: 65
> SecurityInitialHandler.handleRequest(HttpServerExchange) line: 70
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> SecurityContextCreationHandler.handleRequest(HttpServerExchange) line: 54
> PredicateHandler.handleRequest(HttpServerExchange) line: 25
> ServletInitialHandler.handleFirstRequest(HttpServerExchange,
> ServletChain, ServletRequestContext, ServletRequest, ServletResponse)
> line: 207
> ServletInitialHandler.dispatchRequest(HttpServerExchange,
> ServletRequestContext, ServletChain, DispatcherType) line: 194
> ServletInitialHandler.access$000(ServletInitialHandler,
> HttpServerExchange, ServletRequestContext, ServletChain, DispatcherType)
> line: 72
> ServletInitialHandler$1.handleRequest(HttpServerExchange) line: 128
> HttpHandlers.executeRootHandler(HttpHandler, HttpServerExchange,
> boolean) line: 36
> HttpServerExchange$1.run() line: 628
> XnioWorker$TaskPool(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker)
> line: not available
> ThreadPoolExecutor$Worker.run() line: not available
> Thread.run() line: not available
>
>
> Best regards
>
> Wolfgang Knauf
>
> _______________________________________________
> undertow-dev mailing list
> undertow-dev(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/undertow-dev
_______________________________________________
undertow-dev mailing list
undertow-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/undertow-dev