Don't crash on very long inputs
authorManuel Nickschas <sputnick@quassel-irc.org>
Sat, 1 Mar 2014 13:07:36 +0000 (14:07 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sat, 1 Mar 2014 13:07:36 +0000 (14:07 +0100)
Because our style engine uses 16 bit indexes, strings can only be
styled if they're shorter than 2^16 characters. We do check for this
in the style engine and refuse to style strings that are longer.

However, just returning an default-constructed StyledString() is wrong,
because other places rely on there being at least one format and the
plaintext be initialized. So the proper way of handling this is just
using the baseFormat and the full string as plaintext instead of an
empty StyledString.

Fixes #1257.

src/uisupport/uistyle.cpp

index 0e00d51..8228b8f 100644 (file)
@@ -491,12 +491,16 @@ QList<QTextLayout::FormatRange> UiStyle::toTextLayoutList(const FormatList &form
 UiStyle::StyledString UiStyle::styleString(const QString &s_, quint32 baseFormat)
 {
     QString s = s_;
 UiStyle::StyledString UiStyle::styleString(const QString &s_, quint32 baseFormat)
 {
     QString s = s_;
+    StyledString result;
+    result.formatList.append(qMakePair((quint16)0, baseFormat));
+
     if (s.length() > 65535) {
     if (s.length() > 65535) {
+        // We use quint16 for indexes
         qWarning() << QString("String too long to be styled: %1").arg(s);
         qWarning() << QString("String too long to be styled: %1").arg(s);
-        return StyledString();
+        result.plainText = s;
+        return result;
     }
     }
-    StyledString result;
-    result.formatList.append(qMakePair((quint16)0, baseFormat));
+
     quint32 curfmt = baseFormat;
     int pos = 0; quint16 length = 0;
     for (;;) {
     quint32 curfmt = baseFormat;
     int pos = 0; quint16 length = 0;
     for (;;) {