diff options
author | Caolán McNamara <caolanm@redhat.com> | 2022-03-07 09:42:08 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2022-03-07 17:33:36 +0100 |
commit | 71b09e3d267ced19d7727a9cc466ed3adb0767b4 (patch) | |
tree | 4008a61b1f01ffa65482b1b279c95f9933e2cda9 /hwpfilter | |
parent | c85863a3b4c632cdf6b6a7448fcf49ffb6bb5f11 (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.cxx | 32 |
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; |