Fix segv in CFXJSE_FormCalcContext::Time2Num(). There's no reason the document-supplied third argument to TimeToNum() has to correspond to an actual locale. If it doesn't, then continue using the node's locale. Bug: pdfium:1257 Change-Id: I473c4e1982af00494564011c4d6f98b89a20a61f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/77490 Reviewed-by: Daniel Hosseinian <dhoss@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp index dca2a66..84dfaba 100644 --- a/fxjs/xfa/cfxjse_formcalc_context.cpp +++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -2451,13 +2451,14 @@ CXFA_Document* pDoc = ToFormCalcContext(pThis)->GetDocument(); CXFA_LocaleMgr* pMgr = pDoc->GetLocaleMgr(); GCedLocaleIface* pLocale = nullptr; - if (bsLocale.IsEmpty()) { - CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); - pLocale = pThisNode->GetLocale(); - } else { + if (!bsLocale.IsEmpty()) { pLocale = pMgr->GetLocaleByName(WideString::FromUTF8(bsLocale.AsStringView())); } + if (!pLocale) { + CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); + pLocale = pThisNode->GetLocale(); + } WideString wsFormat; if (bsFormat.IsEmpty()) {
diff --git a/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp b/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp index 977f3f7..0b5ac5a 100644 --- a/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp +++ b/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp
@@ -515,7 +515,9 @@ int result; } tests[] = { // {"Time2Num(\"00:00:00 GMT\", \"HH:MM:SS Z\")", 1}, - {"Time2Num(\"13:13:13 GMT\", \"HH:MM:SS Z\", \"fr_FR\")", 47593001}}; + {"Time2Num(\"\", \"\", 1)", 0}, // https://crbug.com/pdfium/1257 + {"Time2Num(\"13:13:13 GMT\", \"HH:MM:SS Z\", \"fr_FR\")", 47593001}, + }; for (size_t i = 0; i < pdfium::size(tests); ++i) ExecuteExpectInt32(tests[i].program, tests[i].result);