Author: britter Date: Sun Apr 26 19:42:42 2015 New Revision: 1676141 URL: http://svn.apache.org/r1676141 Log: IMAGING-169: PnmImageParser throws NumberFormatException instead of ImageReadException when parsing invalid images. This also fixes #16 from github. Thanks to Nebu Pookins.
Added: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/pnm/ commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/pnm/PnmImageParserTest.java Modified: commons/proper/imaging/trunk/src/changes/changes.xml commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java Modified: commons/proper/imaging/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/changes/changes.xml?rev=1676141&r1=1676140&r2=1676141&view=diff ============================================================================== --- commons/proper/imaging/trunk/src/changes/changes.xml (original) +++ commons/proper/imaging/trunk/src/changes/changes.xml Sun Apr 26 19:42:42 2015 @@ -46,6 +46,9 @@ The <action> type attribute can be add,u <body> <release version="1.0" date="TBA" description="TBA"> + <action issue="IMAGING-169" dev="britter" type="fix" due-to="Nebu Pookins"> + PnmImageParser throws NumberFormatException instead of ImageReadException when parsing invalid images + </action> <action issue="IMAGING-166" dev="britter" type="update" due-to="Michael GroÃ"> ByteSourceImageTest: Local variable hides a field </action> Modified: commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java?rev=1676141&r1=1676140&r2=1676141&view=diff ============================================================================== --- commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java (original) +++ commons/proper/imaging/trunk/src/main/java/org/apache/commons/imaging/formats/pnm/PnmImageParser.java Sun Apr 26 19:42:42 2015 @@ -101,8 +101,18 @@ public class PnmImageParser extends Imag || identifier2 == PnmConstants.PPM_TEXT_CODE || identifier2 == PnmConstants.PPM_RAW_CODE) { - final int width = Integer.parseInt(wsr.readtoWhiteSpace()); - final int height = Integer.parseInt(wsr.readtoWhiteSpace()); + final int width; + try { + width = Integer.parseInt(wsr.readtoWhiteSpace()); + } catch (NumberFormatException e) { + throw new ImageReadException("Invalid width specified." , e); + } + final int height; + try { + height = Integer.parseInt(wsr.readtoWhiteSpace()); + } catch (NumberFormatException e) { + throw new ImageReadException("Invalid height specified." , e); + } if (identifier2 == PnmConstants.PBM_TEXT_CODE) { return new PbmFileInfo(width, height, false); Added: commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/pnm/PnmImageParserTest.java URL: http://svn.apache.org/viewvc/commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/pnm/PnmImageParserTest.java?rev=1676141&view=auto ============================================================================== --- commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/pnm/PnmImageParserTest.java (added) +++ commons/proper/imaging/trunk/src/test/java/org/apache/commons/imaging/formats/pnm/PnmImageParserTest.java Sun Apr 26 19:42:42 2015 @@ -0,0 +1,47 @@ +package org.apache.commons.imaging.formats.pnm; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.Map; + +import org.apache.commons.imaging.ImageInfo; +import org.apache.commons.imaging.ImageReadException; +import org.junit.Test; + +public class PnmImageParserTest { + + @Test + public void testGetImageInfo_happyCase() throws ImageReadException, IOException { + byte[] bytes = "P1\n3 2\n0 1 0\n1 0 1\n".getBytes(StandardCharsets.US_ASCII); + Map<String, Object> params = Collections.emptyMap(); + PnmImageParser underTest = new PnmImageParser(); + ImageInfo results = underTest.getImageInfo(bytes, params); + assertEquals(results.getBitsPerPixel(), 1); + assertEquals(results.getWidth(), 3); + assertEquals(results.getHeight(), 2); + assertEquals(results.getNumberOfImages(), 1); + } + + /** + * If an invalid width is specified, should throw {@link ImageReadException} rather than + * {@link NumberFormatException}. + */ + @Test(expected = ImageReadException.class) + public void testGetImageInfo_invalidWidth() throws ImageReadException, IOException { + byte[] bytes = "P1\na 2\n0 0 0 0 0 0 0 0 0 0 0\n1 1 1 1 1 1 1 1 1 1 1\n".getBytes(StandardCharsets.US_ASCII); + Map<String, Object> params = Collections.emptyMap(); + PnmImageParser underTest = new PnmImageParser(); + underTest.getImageInfo(bytes, params); + } + + @Test(expected = ImageReadException.class) + public void testGetImageInfo_invalidHeight() throws ImageReadException, IOException { + byte[] bytes = "P1\n2 a\n0 0\n0 0\n0 0\n0 0\n0 0\n0 1\n1 1\n1 1\n1 1\n1 1\n1 1\n".getBytes(StandardCharsets.US_ASCII); + Map<String, Object> params = Collections.emptyMap(); + PnmImageParser underTest = new PnmImageParser(); + underTest.getImageInfo(bytes, params); + } +}