Uploaded image for project: 'Bitbucket Data Center'
  1. Bitbucket Data Center
  2. BSERV-5373

Branch listing page throws an error for commit messages written in non-UTF8 encoding

    XMLWordPrintable

Details

    Description

      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:

      1. 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
      2. 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
      

      Attachments

        Issue Links

          Activity

            People

              jpalacios Juan Palacios (Inactive)
              jgorman James Gorman
              Votes:
              3 Vote for this issue
              Watchers:
              19 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: