GetMap request with transparent=true and format=image/png8 can result in 
ArrayIndexOutOfBoundsException
-------------------------------------------------------------------------------------------------------

                 Key: GEOS-4783
                 URL: https://jira.codehaus.org/browse/GEOS-4783
             Project: GeoServer
          Issue Type: Bug
          Components: WMS
    Affects Versions: 2.1.1
            Reporter: Gabriel Roldán
            Assignee: Simone Giannecchini
            Priority: Critical


Hello, I think I should be reporting this issue in GEOT instead, but my worry 
is the coming GeoServer relase as this affects the png8 output of GWC.

To reproduce, make the following request against the cite:precip30min layer 
from the release data dir:
{code}
$ curl -v 
"http://localhost:8080/geoserver/wms?LAYERS=cite%3Aprecip30min&FORMAT=image%2Fpng8&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&&SRS=EPSG%3A4326&BBOX=-90,0,0,90&WIDTH=256&HEIGHT=256&transparent=true";
 
...
< HTTP/1.1 200 OK
< Content-Type: application/vnd.ogc.se_xml; charset=UTF-8
< 
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE 
ServiceExceptionReport SYSTEM 
"http://localhost:8080/geoserver/schemas/wms/1.1.1/WMS_exception_1_1_1.dtd";> 
<ServiceExceptionReport version="1.1.1" >   <ServiceException>
      java.lang.ArrayIndexOutOfBoundsException: 2
2
Details:
org.geoserver.platform.ServiceException: 
java.lang.ArrayIndexOutOfBoundsException: 2
        at org.geoserver.ows.Dispatcher.exception(Dispatcher.java:1324)
.....
Caused by: java.lang.ArrayIndexOutOfBoundsException: 2
        at 
org.geotools.image.palette.CustomPaletteBuilder.insertNode(CustomPaletteBuilder.java:380)
        at 
org.geotools.image.palette.CustomPaletteBuilder.buildPalette(CustomPaletteBuilder.java:345)
        at 
org.geoserver.wms.map.ImageUtils.forceIndexed8Bitmask(ImageUtils.java:265)
        at 
org.geoserver.wms.map.RenderedImageMapResponse.forceIndexed8Bitmask(RenderedImageMapResponse.java:140)
        at 
org.geoserver.wms.map.PNGMapResponse.formatImageOutputStream(PNGMapResponse.java:81)
        at 
org.geoserver.wms.map.RenderedImageMapResponse.write(RenderedImageMapResponse.java:114)
        ... 60 more
{code}


It turns out that if the request comes with transparent=true, the resulting 
image is a 2-band one, and CustomPaletteBuilder has trouble with it.
The following patch seems to fix it:

{code}

diff --git 
a/modules/library/coverage/src/main/java/org/geotools/image/palette/CustomPaletteBuilder.java
 
b/modules/library/coverage/src/main/java/org/geotools/image/palette/CustomPaletteBuilder.java
index d5f41da..9fe4452 100644
--- 
a/modules/library/coverage/src/main/java/org/geotools/image/palette/CustomPaletteBuilder.java
+++ 
b/modules/library/coverage/src/main/java/org/geotools/image/palette/CustomPaletteBuilder.java
@@ -376,8 +376,8 @@ public final class CustomPaletteBuilder {
                final int numBands = rgba.length;
                aNode.colorCount++;
                aNode.red += rgba[0];
-               aNode.green += rgba[numBands == 1 ? 0 : 1];
-               aNode.blue += rgba[numBands == 1 ? 0 : 2];
+               aNode.green += rgba[numBands < 3 ? 0 : 1];
+               aNode.blue += rgba[numBands < 3 ? 0 : 2];
 
                if (!aNode.isLeaf) {
                        int branchIndex = getBranchIndex(rgba, aLevel);
@@ -463,8 +463,8 @@ public final class CustomPaletteBuilder {
                final int numBands = rgba.length;
                int shift = maxLevel - aLevel;
                int red_index = 0x1 & ((0xff & rgba[0]) >> shift);
-               int green_index = 0x1 & ((0xff & rgba[numBands == 1 ? 0 : 1]) 
>> shift);
-               int blue_index = 0x1 & ((0xff & rgba[numBands == 1 ? 0 : 2]) >> 
shift);
+               int green_index = 0x1 & ((0xff & rgba[numBands < 3? 0 : 1]) >> 
shift);
+               int blue_index = 0x1 & ((0xff & rgba[numBands < 3 ? 0 : 2]) >> 
shift);
                int index = (red_index << 2) | (green_index << 1) | blue_index;
{code}





--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

       

------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
Geoserver-devel mailing list
Geoserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-devel

Reply via email to