From 12c90ff05b7d904b95e135f7a8a0c93964c9c3f6 Mon Sep 17 00:00:00 2001 From: Vincent Rabaud Date: Thu, 2 Apr 2026 15:58:41 +0200 Subject: [PATCH] Fix invalid PAM decoding This fixes https://issues.oss-fuzz.com/issues/497290557 --- modules/imgcodecs/src/grfmt_pam.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/modules/imgcodecs/src/grfmt_pam.cpp b/modules/imgcodecs/src/grfmt_pam.cpp index 12371e1f5d..efae09f033 100644 --- a/modules/imgcodecs/src/grfmt_pam.cpp +++ b/modules/imgcodecs/src/grfmt_pam.cpp @@ -481,6 +481,23 @@ bool PAMDecoder::readHeader() } } while (fieldtype != PAM_HEADER_ENDHDR); + if (selected_fmt != IMWRITE_PAM_FORMAT_NULL && flds_depth) { + if (selected_fmt == IMWRITE_PAM_FORMAT_BLACKANDWHITE && m_channels != 1) { + CV_Error(Error::StsError, "fmt is IMWRITE_PAM_FORMAT_BLACKANDWHITE but number of channels is not 1"); + } + if (selected_fmt == IMWRITE_PAM_FORMAT_GRAYSCALE && m_channels != 1) { + CV_Error(Error::StsError, "fmt is IMWRITE_PAM_FORMAT_GRAYSCALE but number of channels is not 1"); + } + if (selected_fmt == IMWRITE_PAM_FORMAT_GRAYSCALE_ALPHA && m_channels != 2) { + CV_Error(Error::StsError, "fmt is IMWRITE_PAM_FORMAT_GRAYSCALE_ALPHA but number of channels is not 2"); + } + if (selected_fmt == IMWRITE_PAM_FORMAT_RGB && m_channels != 3) { + CV_Error(Error::StsError, "fmt is IMWRITE_PAM_FORMAT_RGB but number of channels is not 3"); + } + if (selected_fmt == IMWRITE_PAM_FORMAT_RGB_ALPHA && m_channels != 4) { + CV_Error(Error::StsError, "fmt is IMWRITE_PAM_FORMAT_RGB_ALPHA but number of channels is not 4"); + } + } if (flds_endhdr && flds_height && flds_width && flds_depth && flds_maxval) { if (selected_fmt == IMWRITE_PAM_FORMAT_NULL)