diff options
author | Eike Rathke <erack@redhat.com> | 2014-07-02 22:24:52 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2014-07-04 11:33:53 +0200 |
commit | 4f369500d316126d4d7a9a1856e9ea481e735254 (patch) | |
tree | 54110098c318129e844ae3b14f22216d679ef76d /svl | |
parent | 377f7a8f6bbc661bf70bbbc1651ceb2b397a6b48 (diff) |
resolved fdo#80166 check input against date acceptance pattern plausibility
... to prevent confusion of #.### input with D.M that then later is
discarded as invalid date input instead of accepted as valid numeric
input.
(cherry picked from commit 836e504c859a5b67f7ab7ba842785951d41058cd)
work around nonsense -Werror=maybe-uninitialized, fdo#80166 follow-up
(cherry picked from commit 397362d8532d7b0abe38f2024dd2cefe2482d6a3)
0f9cf74550e43d174bf6ac75e70c51ab7f51ccf8
Change-Id: I178e28b7ef3b26d04eecc73e5e5c61ee41f89e32
Reviewed-on: https://gerrit.libreoffice.org/10037
Tested-by: David Tardon <dtardon@redhat.com>
Reviewed-by: David Tardon <dtardon@redhat.com>
Diffstat (limited to 'svl')
-rw-r--r-- | svl/source/numbers/zforfind.cxx | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx index 230254026e90..5aee40defd3b 100644 --- a/svl/source/numbers/zforfind.cxx +++ b/svl/source/numbers/zforfind.cxx @@ -1186,6 +1186,8 @@ bool ImpSvNumberInputScan::IsAcceptedDatePattern( sal_uInt16 nStartPatternAt ) } nDatePatternStart = nStartPatternAt; // remember start particle + const sal_Int32 nMonthsInYear = pFormatter->GetCalendar()->getNumberOfMonthsInYear(); + for (sal_Int32 nPattern=0; nPattern < sDateAcceptancePatterns.getLength(); ++nPattern) { sal_uInt16 nNext = nDatePatternStart; @@ -1195,12 +1197,46 @@ bool ImpSvNumberInputScan::IsAcceptedDatePattern( sal_uInt16 nStartPatternAt ) sal_Int32 nPat = 0; for ( ; nPat < rPat.getLength() && bOk && nNext < nAnzStrings; ++nPat, ++nNext) { - switch (rPat[nPat]) + const sal_Unicode c = rPat[nPat]; + switch (c) { case 'Y': case 'M': case 'D': bOk = IsNum[nNext]; + if (bOk && (c == 'M' || c == 'D')) + { + // Check the D and M cases for plausibility. This also + // prevents recognition of date instead of number with a + // numeric group input if date separator is identical to + // group separator, for example with D.M as a pattern and + // #.### as a group. + sal_Int32 nMaxLen, nMaxVal; + switch (c) + { + case 'M': + nMaxLen = 2; + nMaxVal = nMonthsInYear; + break; + case 'D': + nMaxLen = 2; + nMaxVal = 31; + break; + default: + // This merely exists against + // -Werror=maybe-uninitialized, which is nonsense + // after the (c == 'M' || c == 'D') check above, + // but ... + nMaxLen = 2; + nMaxVal = 31; + } + bOk = (sStrArray[nNext].getLength() <= nMaxLen); + if (bOk) + { + sal_Int32 nNum = sStrArray[nNext].toInt32(); + bOk = (1 <= nNum && nNum <= nMaxVal); + } + } if (bOk) ++nDatePatternNumbers; break; |