diff --git a/src/psd.imageio/psdinput.cpp b/src/psd.imageio/psdinput.cpp index e22617db63..beb511b88e 100644 --- a/src/psd.imageio/psdinput.cpp +++ b/src/psd.imageio/psdinput.cpp @@ -1013,25 +1013,36 @@ PSDInput::validate_header() errorfmt("[Header] invalid depth {}", m_header.depth); return false; } - if (m_WantRaw) - return true; - - //There are other (undocumented) color modes not listed here + // Reject any color mode outside the known set before the RawColor early + // return below: setup() indexes mode_channel_count/mode_channel_names by + // m_header.color_mode unconditionally (even for raw reads), so an + // out-of-table value (or one of the undocumented gaps, e.g. 5 and 6) + // must never reach that point regardless of m_WantRaw. switch (m_header.color_mode) { case ColorMode_Bitmap: case ColorMode_Indexed: case ColorMode_RGB: case ColorMode_Grayscale: case ColorMode_CMYK: - case ColorMode_Multichannel: break; + case ColorMode_Multichannel: case ColorMode_Duotone: - case ColorMode_Lab: - errorfmt("[Header] unsupported color mode {:d}", m_header.color_mode); - return false; + case ColorMode_Lab: break; default: errorfmt("[Header] unrecognized color mode {:d}", m_header.color_mode); return false; } + + if (m_WantRaw) + return true; + + // Duotone and Lab are only supported via the raw path (handled above). + switch (m_header.color_mode) { + case ColorMode_Duotone: + case ColorMode_Lab: + errorfmt("[Header] unsupported color mode {:d}", m_header.color_mode); + return false; + default: break; + } return true; } diff --git a/testsuite/psd-colormodes/ref/out.txt b/testsuite/psd-colormodes/ref/out.txt index 18975023b1..bce87a0473 100644 --- a/testsuite/psd-colormodes/ref/out.txt +++ b/testsuite/psd-colormodes/ref/out.txt @@ -23,6 +23,10 @@ indexed-transparency-0.psd : 200 x 150, 4 channel, uint8 psd indexed-transparency-255.psd : 200 x 150, 4 channel, uint8 psd SHA-1: BEF32B02F44B369E39670DC2E2D2D1578B4998AD indexed-transparency-256-rejected +oiiotool ERROR: read : [Header] unrecognized color mode 20 +failed to open "src/bad_colormode.psd": failed load_header +Full command line was: +> oiiotool --nostderr --info --iconfig oiio:RawColor 1 src/bad_colormode.psd Comparing "pattern2-8-rgb.psd.tif" and "ref/pattern2.tif" PASS Comparing "pattern2-16-rgb.psd.tif" and "ref/pattern2.tif" diff --git a/testsuite/psd-colormodes/run.py b/testsuite/psd-colormodes/run.py index d94641bf96..4dbb444958 100755 --- a/testsuite/psd-colormodes/run.py +++ b/testsuite/psd-colormodes/run.py @@ -35,4 +35,7 @@ + "out.null > /dev/null 2>&1 " + "|| echo indexed-transparency-256-rejected)") +# Regression test: bad colormode +command += oiiotool ("--nostderr --info --iconfig oiio:RawColor 1 src/bad_colormode.psd", failureok=True) + outputs += [ "out.txt" ] diff --git a/testsuite/psd-colormodes/src/bad_colormode.psd b/testsuite/psd-colormodes/src/bad_colormode.psd new file mode 100644 index 0000000000..3d442899a9 Binary files /dev/null and b/testsuite/psd-colormodes/src/bad_colormode.psd differ