diff options
| author | 2023-11-13 19:35:49 +0300 | |
|---|---|---|
| committer | 2023-11-13 17:35:49 +0100 | |
| commit | 75af3ecbab799de70fe2b79cd72c8cc705ff430a (patch) | |
| tree | b46d8fa83c2e70df30751515a79cdece27d878bd /src | |
| parent | Make macos dmg nightlies more orderable (#2560) (diff) | |
| download | KVIrc-75af3ecbab799de70fe2b79cd72c8cc705ff430a.tar.gz KVIrc-75af3ecbab799de70fe2b79cd72c8cc705ff430a.tar.bz2 KVIrc-75af3ecbab799de70fe2b79cd72c8cc705ff430a.zip | |
Fix text[idx] out of bounds assertion in KviTopicWidget::paintColoredText (#2561)
Diffstat (limited to 'src')
| -rw-r--r-- | src/kvirc/ui/KviTopicWidget.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/kvirc/ui/KviTopicWidget.cpp b/src/kvirc/ui/KviTopicWidget.cpp index d37b53353..fd0251832 100644 --- a/src/kvirc/ui/KviTopicWidget.cpp +++ b/src/kvirc/ui/KviTopicWidget.cpp @@ -184,6 +184,22 @@ void KviTopicWidget::applyOptions() m_pLabel->setText(KviHtmlGenerator::convertToHtml(m_szTopic, true)); } +static bool isKviControlCode(unsigned short c) +{ + switch (c) { + case KviControlCodes::Color: + case KviControlCodes::Bold: + case KviControlCodes::Italic: + case KviControlCodes::Underline: + case KviControlCodes::Reverse: + case KviControlCodes::Reset: + case KviControlCodes::Icon: + return true; + default: + return false; + } +} + void KviTopicWidget::paintColoredText(QPainter * p, QString text, const QPalette & cg, const QRect & rect) { QFontMetrics fm(p->fontMetrics()); @@ -202,15 +218,17 @@ void KviTopicWidget::paintColoredText(QPainter * p, QString text, const QPalette while((idx < (unsigned int)text.length()) && (curX < maxX)) { - unsigned short c = text[(int)idx].unicode(); - + unsigned short c; unsigned int start = idx; - while((idx < (unsigned int)text.length()) && (c != KviControlCodes::Color) && (c != KviControlCodes::Bold) && (c != KviControlCodes::Italic) && (c != KviControlCodes::Underline) && (c != KviControlCodes::Reverse) && (c != KviControlCodes::Reset) && (c != KviControlCodes::Icon)) + do { - idx++; c = text[(int)idx].unicode(); - } + if (isKviControlCode(c)) + break; + + idx++; + } while((idx < (unsigned int)text.length())); int len = idx - start; int wdth; |
