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);