aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autotests/kconfigtest.cpp29
-rw-r--r--autotests/kconfigtest.h1
-rw-r--r--src/core/kconfigini.cpp2
3 files changed, 31 insertions, 1 deletions
diff --git a/autotests/kconfigtest.cpp b/autotests/kconfigtest.cpp
index 45fe8e53..a60ea57a 100644
--- a/autotests/kconfigtest.cpp
+++ b/autotests/kconfigtest.cpp
@@ -1719,6 +1719,35 @@ void KConfigTest::testAnonymousConfig()
QCOMPARE(general.readEntry("Foo"), QString("Bar"));
}
+void KConfigTest::testQByteArrayUtf8()
+{
+ QTemporaryFile file;
+ QVERIFY(file.open());
+ qWarning() << file.fileName();
+ KConfig config(file.fileName(), KConfig::SimpleConfig);
+ KConfigGroup general(&config, "General");
+ QByteArray bytes(256, '\0');
+ for (int i = 0; i < 256; i++) {
+ bytes[i] = i;
+ }
+ general.writeEntry("Utf8", bytes);
+ config.sync();
+ file.flush();
+ file.close();
+ QFile readFile(file.fileName());
+ QVERIFY(readFile.open(QFile::ReadOnly));
+#ifndef Q_OS_WIN
+ QCOMPARE(readFile.readAll(), QByteArrayLiteral("[General]\nUtf8=\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff\n"));
+#else
+ QCOMPARE(readFile.readAll(), QByteArrayLiteral("[General]\r\nUtf8=\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\t\\n\\x0b\\x0c\\r\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\\x7f\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff\r\n"));
+#endif
+
+ // check that reading works
+ KConfig config2(file.fileName(), KConfig::SimpleConfig);
+ KConfigGroup general2(&config2, "General");
+ QCOMPARE(bytes, general2.readEntry("Utf8", QByteArray()));
+}
+
void KConfigTest::testNewlines()
{
// test that kconfig always uses the native line endings
diff --git a/autotests/kconfigtest.h b/autotests/kconfigtest.h
index 708da042..0715f45e 100644
--- a/autotests/kconfigtest.h
+++ b/autotests/kconfigtest.h
@@ -63,6 +63,7 @@ private Q_SLOTS:
void testConfigCopyToSync();
void testReparent();
void testAnonymousConfig();
+ void testQByteArrayUtf8();
void testSubGroup();
void testAddConfigSources();
diff --git a/src/core/kconfigini.cpp b/src/core/kconfigini.cpp
index c7b36efd..39e59364 100644
--- a/src/core/kconfigini.cpp
+++ b/src/core/kconfigini.cpp
@@ -673,7 +673,7 @@ QByteArray KConfigIniBackend::stringToPrintable(const QByteArray &aString, Strin
switch (s[i]) {
default:
// The \n, \t, \r cases (all < 32) are handled below; we can ignore them here
- if (((unsigned char)s[i]) < 32) {
+ if (((unsigned char)s[i]) < 32 || ((unsigned char)s[i]) >= 127) {
goto doEscape;
}
*data++ = s[i];