diff options
author | Tom Sepez <tsepez@chromium.org> | 2018-04-12 18:33:55 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-04-12 18:33:55 +0000 |
commit | 154e18f9a862975abecebe77b8f5fb418418d14c (patch) | |
tree | 18e9381c1a4324abcd98296e1e1714c2f926e006 /fxjs/cfxjse_resolveprocessor.cpp | |
parent | 7f821c11081fe90346823333622253ec7949b583 (diff) | |
download | pdfium-154e18f9a862975abecebe77b8f5fb418418d14c.tar.xz |
Return pdfium::span<wchar_t> from WideString::GetBuffer().
Adds bounds checking "for free", but beware of span outliving
a ReleaseBuffer() call. Scoping as such avoids the possibility
of using an invalid span (and it is flagged as a lifetime issue).
Change-Id: Ica63f4b1429823d0254ec6951aeaeb08160cb93c
Reviewed-on: https://pdfium-review.googlesource.com/30310
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'fxjs/cfxjse_resolveprocessor.cpp')
-rw-r--r-- | fxjs/cfxjse_resolveprocessor.cpp | 107 |
1 files changed, 55 insertions, 52 deletions
diff --git a/fxjs/cfxjse_resolveprocessor.cpp b/fxjs/cfxjse_resolveprocessor.cpp index 2ca0838a7f..46163b55fc 100644 --- a/fxjs/cfxjse_resolveprocessor.cpp +++ b/fxjs/cfxjse_resolveprocessor.cpp @@ -499,66 +499,69 @@ int32_t CFXJSE_ResolveProcessor::GetFilter(const WideStringView& wsExpression, WideString& wsName = rnd.m_wsName; WideString& wsCondition = rnd.m_wsCondition; - wchar_t* pNameBuf = wsName.GetBuffer(iLength - nStart); - wchar_t* pConditionBuf = wsCondition.GetBuffer(iLength - nStart); int32_t nNameCount = 0; int32_t nConditionCount = 0; - std::vector<int32_t> stack; - int32_t nType = -1; - const wchar_t* pSrc = wsExpression.unterminated_c_str(); - wchar_t wPrev = 0; - wchar_t wCur; - bool bIsCondition = false; - while (nStart < iLength) { - wCur = pSrc[nStart++]; - if (wCur == '.') { - if (wPrev == '\\') { - pNameBuf[nNameCount - 1] = wPrev = '.'; - continue; + { + // Span's lifetime must end before ReleaseBuffer() below. + pdfium::span<wchar_t> pNameBuf = wsName.GetBuffer(iLength - nStart); + pdfium::span<wchar_t> pConditionBuf = + wsCondition.GetBuffer(iLength - nStart); + std::vector<int32_t> stack; + int32_t nType = -1; + const wchar_t* pSrc = wsExpression.unterminated_c_str(); + wchar_t wPrev = 0; + wchar_t wCur; + bool bIsCondition = false; + while (nStart < iLength) { + wCur = pSrc[nStart++]; + if (wCur == '.') { + if (wPrev == '\\') { + pNameBuf[nNameCount - 1] = wPrev = '.'; + continue; + } + if (nNameCount == 0) { + rnd.m_dwStyles |= XFA_RESOLVENODE_AnyChild; + continue; + } + + wchar_t wLookahead = nStart < iLength ? pSrc[nStart] : 0; + if (wLookahead != '[' && wLookahead != '(' && nType < 0) + break; } - if (nNameCount == 0) { - rnd.m_dwStyles |= XFA_RESOLVENODE_AnyChild; - continue; + if (wCur == '[' || wCur == '(') { + bIsCondition = true; + } else if (wCur == '.' && nStart < iLength && + (pSrc[nStart] == '[' || pSrc[nStart] == '(')) { + bIsCondition = true; } - - wchar_t wLookahead = nStart < iLength ? pSrc[nStart] : 0; - if (wLookahead != '[' && wLookahead != '(' && nType < 0) - break; - } - if (wCur == '[' || wCur == '(') { - bIsCondition = true; - } else if (wCur == '.' && nStart < iLength && - (pSrc[nStart] == '[' || pSrc[nStart] == '(')) { - bIsCondition = true; - } - if (bIsCondition) - pConditionBuf[nConditionCount++] = wCur; - else - pNameBuf[nNameCount++] = wCur; - - if ((nType == 0 && wCur == ']') || (nType == 1 && wCur == ')') || - (nType == 2 && wCur == '"')) { - nType = stack.empty() ? -1 : stack.back(); - if (!stack.empty()) - stack.pop_back(); - } else if (wCur == '[') { - stack.push_back(nType); - nType = 0; - } else if (wCur == '(') { - stack.push_back(nType); - nType = 1; - } else if (wCur == '"') { - stack.push_back(nType); - nType = 2; + if (bIsCondition) + pConditionBuf[nConditionCount++] = wCur; + else + pNameBuf[nNameCount++] = wCur; + + if ((nType == 0 && wCur == ']') || (nType == 1 && wCur == ')') || + (nType == 2 && wCur == '"')) { + nType = stack.empty() ? -1 : stack.back(); + if (!stack.empty()) + stack.pop_back(); + } else if (wCur == '[') { + stack.push_back(nType); + nType = 0; + } else if (wCur == '(') { + stack.push_back(nType); + nType = 1; + } else if (wCur == '"') { + stack.push_back(nType); + nType = 2; + } + wPrev = wCur; } - wPrev = wCur; + if (!stack.empty()) + return -1; } - if (!stack.empty()) - return -1; - wsName.ReleaseBuffer(nNameCount); - wsName.Trim(); wsCondition.ReleaseBuffer(nConditionCount); + wsName.Trim(); wsCondition.Trim(); rnd.m_uHashName = static_cast<XFA_HashCode>(FX_HashCode_GetW(wsName.AsStringView(), false)); |