summaryrefslogtreecommitdiff
path: root/hwpfilter
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2022-03-07 09:42:08 +0000
committerCaolán McNamara <caolanm@redhat.com>2022-03-07 17:33:36 +0100
commit71b09e3d267ced19d7727a9cc466ed3adb0767b4 (patch)
tree4008a61b1f01ffa65482b1b279c95f9933e2cda9 /hwpfilter
parentc85863a3b4c632cdf6b6a7448fcf49ffb6bb5f11 (diff)
ofz#45314 limit to valid day/month indexes
Change-Id: Ibf53fa1a0c1db3046a25367fb79da3b90f7cd924 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131021 Reviewed-by: Michael Stahl <michael.stahl@allotropia.de> Tested-by: Jenkins
Diffstat (limited to 'hwpfilter')
-rw-r--r--hwpfilter/source/hbox.cxx32
1 files changed, 25 insertions, 7 deletions
diff --git a/hwpfilter/source/hbox.cxx b/hwpfilter/source/hbox.cxx
index f9c1542b7cab..e4f555efa320 100644
--- a/hwpfilter/source/hbox.cxx
+++ b/hwpfilter/source/hbox.cxx
@@ -173,13 +173,20 @@ hchar_string DateCode::GetString()
num = date[MONTH];
break;
case '@':
- memcpy(cbuf, eng_mon + (date[MONTH] - 1) * 3, 3);
+ {
+ static_assert((std::size(eng_mon) - 1) / 3 == 12);
+ size_t nIndex = (date[MONTH] - 1) % 12;
+ memcpy(cbuf, eng_mon + nIndex * 3, 3);
cbuf[3] = '.';
cbuf[4] = 0;
- break;
+ break;
+ }
case '*':
- strncat(cbuf, en_mon[date[MONTH] - 1], sizeof(cbuf) - strlen(cbuf) - 1);
+ {
+ size_t nIndex = (date[MONTH] - 1) % std::size(en_mon);
+ strncat(cbuf, en_mon[nIndex], sizeof(cbuf) - strlen(cbuf) - 1);
break;
+ }
case '3': /* 'D' is day of korean */
num = date[DAY];
break;
@@ -212,16 +219,26 @@ hchar_string DateCode::GetString()
num = date[MIN];
break;
case '6':
- ret.push_back(kor_week[date[WEEK]]);
+ {
+ size_t nIndex = date[WEEK] % std::size(kor_week);
+ ret.push_back(kor_week[nIndex]);
break;
+ }
case '^':
- memcpy(cbuf, eng_week + date[WEEK] * 3, 3);
+ {
+ static_assert((std::size(eng_week) - 1) / 3 == 7);
+ size_t nIndex = date[WEEK] % 7;
+ memcpy(cbuf, eng_week + nIndex * 3, 3);
cbuf[3] = '.';
cbuf[4] = 0;
break;
+ }
case '_':
- strncat(cbuf, en_week[date[WEEK]], sizeof(cbuf) - strlen(cbuf) - 1);
+ {
+ size_t nIndex = date[WEEK] % std::size(en_week);
+ strncat(cbuf, en_week[nIndex], sizeof(cbuf) - strlen(cbuf) - 1);
break;
+ }
case '7':
ret.push_back(0xB5A1);
ret.push_back(is_pm ? 0xD281 : 0xB8E5);
@@ -257,7 +274,8 @@ hchar_string DateCode::GetString()
fmt++;
if (*fmt == '6')
{
- ret.push_back(china_week[date[WEEK]]);
+ size_t nIndex = date[WEEK] % std::size(china_week);
+ ret.push_back(china_week[nIndex]);
break;
}
break;