hwpfilter/source/hbox.cxx | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-)
New commits: commit 2859fddaaef3b7fecc686946dc72576fa939d511 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Mar 7 09:42:08 2022 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Mar 7 13:38:39 2022 +0100 ofz#45314 limit to valid day/month indexes Change-Id: Ibf53fa1a0c1db3046a25367fb79da3b90f7cd924 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131020 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> 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;