summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-09-18 13:51:29 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-09-23 11:28:58 +0200
commite66a878838f17a0626b0b10b340b1ca4dba56cc1 (patch)
tree60954f81301391e183d393f530a92fdff95a836a
parent3bfdacaaebfcb3299eedd6f02977b49e732cfc30 (diff)
QSettings: Don't chop off trailing tabs that were actually part of a value.
This was done wrong when using the ini format. Task-number: QTBUG-22461 Change-Id: Ib9390460bce6138659cceac7e3cd25339ba5e9bb Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r--src/corelib/io/qsettings.cpp12
-rw-r--r--tests/auto/corelib/io/qsettings/tst_qsettings.cpp18
2 files changed, 25 insertions, 5 deletions
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index 1748170324..7330a565a2 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -774,11 +774,11 @@ void QSettingsPrivate::iniEscapedString(const QString &str, QByteArray &result,
}
}
-inline static void iniChopTrailingSpaces(QString &str)
+inline static void iniChopTrailingSpaces(QString &str, int limit)
{
int n = str.size() - 1;
QChar ch;
- while (n >= 0 && ((ch = str.at(n)) == QLatin1Char(' ') || ch == QLatin1Char('\t')))
+ while (n >= limit && ((ch = str.at(n)) == QLatin1Char(' ') || ch == QLatin1Char('\t')))
str.truncate(n--);
}
@@ -836,6 +836,7 @@ StSkipSpaces:
// fallthrough
StNormal:
+ int chopLimit = stringResult.length();
while (i < to) {
switch (str.at(i)) {
case '\\':
@@ -873,6 +874,7 @@ StNormal:
} else {
// the character is skipped
}
+ chopLimit = stringResult.length();
break;
case '"':
++i;
@@ -884,7 +886,7 @@ StNormal:
case ',':
if (!inQuotedString) {
if (!currentValueIsQuoted)
- iniChopTrailingSpaces(stringResult);
+ iniChopTrailingSpaces(stringResult, chopLimit);
if (!isStringList) {
isStringList = true;
stringListResult.clear();
@@ -924,6 +926,8 @@ StNormal:
}
}
}
+ if (!currentValueIsQuoted)
+ iniChopTrailingSpaces(stringResult, chopLimit);
goto end;
StHexEscape:
@@ -963,8 +967,6 @@ StOctEscape:
}
end:
- if (!currentValueIsQuoted)
- iniChopTrailingSpaces(stringResult);
if (isStringList)
stringListResult.append(stringResult);
return isStringList;
diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
index 2c9868cd10..e7dae32256 100644
--- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
+++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
@@ -128,6 +128,7 @@ private slots:
void testEmptyData();
void testResourceFiles();
void testRegistryShortRootNames();
+ void trailingWhitespace();
#ifdef Q_OS_MAC
void fileName();
#endif
@@ -2030,6 +2031,23 @@ void tst_QSettings::testRegistryShortRootNames()
#endif
}
+void tst_QSettings::trailingWhitespace()
+{
+ {
+ QSettings s("tst_QSettings_trailingWhitespace");
+ s.setValue("trailingSpace", "x ");
+ s.setValue("trailingTab", "x\t");
+ s.setValue("trailingNewline", "x\n");
+ }
+ {
+ QSettings s("tst_QSettings_trailingWhitespace");
+ QCOMPARE(s.value("trailingSpace").toString(), QLatin1String("x "));
+ QCOMPARE(s.value("trailingTab").toString(), QLatin1String("x\t"));
+ QCOMPARE(s.value("trailingNewline").toString(), QLatin1String("x\n"));
+ s.clear();
+ }
+}
+
void tst_QSettings::fromFile_data()
{
populateWithFormats();