From afd7a21d11854ec1510b5ab4430f4f4c5dc7377c Mon Sep 17 00:00:00 2001 From: Alexey Zelkin Date: Tue, 5 Jul 2016 09:32:29 +0000 Subject: [PATCH] Correctly handle return values from pcre_study(3) If both function's return value and errptr are NULLs, it means that pcre_study() does not make sense, so can be ignored. --- src/operators/verify_cc.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/operators/verify_cc.cc b/src/operators/verify_cc.cc index 88ad55e4..f7b46577 100644 --- a/src/operators/verify_cc.cc +++ b/src/operators/verify_cc.cc @@ -85,9 +85,20 @@ bool VerifyCC::init(const std::string ¶m2, std::string *error) { m_pc = pcre_compile(param.c_str(), PCRE_DOTALL|PCRE_MULTILINE, &errptr, &erroffset, NULL); - m_pce = pcre_study(m_pc, PCRE_STUDY_JIT_COMPILE, &errptr); + if (m_pc == NULL) { + error->assign(errptr); + return false; + } - if ((m_pc == NULL) || (m_pce == NULL)) { + m_pce = pcre_study(m_pc, PCRE_STUDY_JIT_COMPILE, &errptr); + if (m_pce == NULL) { + if (errptr == NULL) { + /* + * Per pcre_study(3) m_pce == NULL && errptr == NULL means + * that no addional information is found, so no need to study + */ + return true; + } error->assign(errptr); return false; }