-
Bug
-
Resolution: Fixed
-
Low
-
3.2.4
When rendering the branch list page, if non-UTF-8 commit messages are encountered, Jackson will abort JSON production, leaving an incomplete JSON object (see end of description for stack trace).
The likely cause is a user setting their accepted character encoding for git to a non-UTF-8 character set (eg EUC-JP). Stash assumes the git default is used by all users.
Pending reproduction there are likely to be two approaches:
- remove the commit messages from the branch list JSON before rendering; this will only be a stop-gap as it does not prevent the problem occurring in other parts of the application
- perform normalization or non-UTF-8 character stripping at read time; this will be more time consuming to implement but a more robust solution
2014-10-14 11:00:46,237 ERROR [http-bio-7990-exec-4025] XXX XXX X.X.X.X,127.0.0.1 "GET /mvc/error500 HTTP/1.1" c.a.s.i.web.ErrorPageController There was an unhandled exception loading [/rest/api/latest/projects/XXX] org.codehaus.jackson.JsonGenerationException: Incomplete surrogate pair: first char 0xde64, second 0xfffd at org.codehaus.jackson.impl.JsonGeneratorBase._reportError(JsonGeneratorBase.java:480) ~[jackson-core-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.impl.Utf8Generator._decodeSurrogate(Utf8Generator.java:1702) ~[jackson-core-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.impl.Utf8Generator._outputSurrogates(Utf8Generator.java:1657) ~[jackson-core-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.impl.Utf8Generator._outputRawMultiByteChar(Utf8Generator.java:1643) ~[jackson-core-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.impl.Utf8Generator.writeRaw(Utf8Generator.java:751) ~[jackson-core-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.impl.Utf8Generator.writeRaw(Utf8Generator.java:691) ~[jackson-core-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.impl.JsonGeneratorBase.writeRawValue(JsonGeneratorBase.java:254) ~[jackson-core-asl-1.9.13.jar:1.9.13] at com.atlassian.stash.rest.data.RestJsonable$RestJsonSerializer.serialize(RestJsonable.java:45) ~[na:na] at com.atlassian.stash.rest.data.RestJsonable$RestJsonSerializer.serialize(RestJsonable.java:39) ~[na:na] at org.codehaus.jackson.map.ser.std.MapSerializer.serializeFields(MapSerializer.java:262) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:186) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:23) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serializeFields(MapSerializer.java:262) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:186) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:23) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:122) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:71) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serializeFields(MapSerializer.java:262) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:186) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.std.MapSerializer.serialize(MapSerializer.java:23) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1604) ~[jackson-mapper-asl-1.9.13.jar:1.9.13] at org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:558) ~[na:na] at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(ContextFilter.java:25) ~[na:na] at com.atlassian.stash.internal.spring.security.StashAuthenticationFilter.doFilter(StashAuthenticationFilter.java:86) ~[StashAuthenticationFilter.class:na] at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doInsideSpringSecurityChain(BeforeLoginPluginAuthenticationFilter.java:111) ~[BeforeLoginPluginAuthenticationFilter.class:na] at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doFilter(BeforeLoginPluginAuthenticationFilter.java:77) ~[BeforeLoginPluginAuthenticationFilter.class:na] at com.atlassian.security.auth.trustedapps.filter.TrustedApplicationsFilter.doFilter(TrustedApplicationsFilter.java:100) ~[atlassian-trusted-apps-core-3.0.6.jar:na] at com.atlassian.oauth.serviceprovider.internal.servlet.OAuthFilter.doFilter(OAuthFilter.java:69) ~[na:na] at com.atlassian.analytics.client.filter.DefaultAnalyticsFilter.doFilter(DefaultAnalyticsFilter.java:33) ~[na:na] at com.atlassian.core.filters.AbstractHttpFilter.doFilter(AbstractHttpFilter.java:31) ~[atlassian-core-4.6.15.jar:na] at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doBeforeBeforeLoginFilters(BeforeLoginPluginAuthenticationFilter.java:89) ~[BeforeLoginPluginAuthenticationFilter.class:na] at com.atlassian.stash.internal.web.auth.BeforeLoginPluginAuthenticationFilter.doFilter(BeforeLoginPluginAuthenticationFilter.java:75) ~[BeforeLoginPluginAuthenticationFilter.class:na] at com.atlassian.stash.internal.request.DefaultRequestManager.doAsRequest(DefaultRequestManager.java:84) ~[stash-service-impl-3.2.4.jar:na] at com.hazelcast.web.WebFilter.doFilter(WebFilter.java:446) ~[hazelcast-wm-3.3-RC2.jar:3.3-RC2] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_21] at java.lang.Thread.run(Thread.java:722) [na:1.7.0_21] ... 181 frames trimmed
- duplicates
-
BSERV-7736 Adding UTF-8 in a commit message causes an error when loading branches
-
- Closed
-
- is duplicated by
-
BSERV-7463 Incomplete surrogate pair
-
- Closed
-
-
BSERV-7736 Adding UTF-8 in a commit message causes an error when loading branches
-
- Closed
-
- relates to
-
BSERV-7791 Non-UTF8 characters in Pull Request description or title causes the branch list page to fail
-
- Closed
-
- is caused by
-
REST-278 Jackson JSON 1.9.1 cannot parse @JsonRawValue annotated fields with UTF-16 surrogate characters
- Done
For those recently finding this issue, it's likely what you're seeing is a slightly different (but related) issue,
BSERV-7791. That issue was fixed in Bitbucket Server 4.9.0 and newer by applying a custom patch directly to jackson-core-asl. If the version shown in your error message is "1.9.13" (as shown in the Bitbucket Server 4.6.0 stack trace above), you do not have the full fix. Our patch was applied and released as 1.9.13-atlassian-1.Best regards,
Bryan Turner
Atlassian Bitbucket