From 6c08eefabfde2d09a94684307aae8fe2163fa1d2 Mon Sep 17 00:00:00 2001 From: mread Date: Fri, 22 Oct 2010 14:01:00 +0100 Subject: Symbian shared memory could not be distinguished by numeric key Fixes a problem where QSharedMemory objects on Symbian could not be distinguished by numeric keys, or keys that differed in any non-alpha way. This is fixed by using the same native key generation system as on other platforms, where a SHA1 hash of the original key is appended to a version of the key with all non-alpha characters stripped. Task-number: QT-3712 Reviewed-by: Shane Kearns --- src/corelib/kernel/qsharedmemory.cpp | 5 ++-- .../auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp | 33 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/corelib/kernel/qsharedmemory.cpp b/src/corelib/kernel/qsharedmemory.cpp index 0782ffe..6d7c7a4 100644 --- a/src/corelib/kernel/qsharedmemory.cpp +++ b/src/corelib/kernel/qsharedmemory.cpp @@ -73,14 +73,13 @@ QSharedMemoryPrivate::makePlatformSafeKey(const QString &key, QString part1 = key; part1.replace(QRegExp(QLatin1String("[^A-Za-z]")), QString()); result.append(part1); -#ifdef Q_OS_SYMBIAN - return result.left(KMaxKernelName); -#endif QByteArray hex = QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Sha1).toHex(); result.append(QLatin1String(hex)); #ifdef Q_OS_WIN return result; +#elif defined(Q_OS_SYMBIAN) + return result.left(KMaxKernelName); #else return QDir::tempPath() + QLatin1Char('/') + result; #endif diff --git a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp index dc071ab..18a0cb0 100644 --- a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp +++ b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp @@ -107,6 +107,10 @@ private slots: void useTooMuchMemory(); void attachTooMuch(); + // unique keys + void uniqueKey_data(); + void uniqueKey(); + protected: int remove(const QString &key); @@ -795,6 +799,35 @@ void tst_QSharedMemory::simpleProcessProducerConsumer() QCOMPARE(failedProcesses, (unsigned int)(0)); } +void tst_QSharedMemory::uniqueKey_data() +{ + QTest::addColumn("key1"); + QTest::addColumn("key2"); + + QTest::newRow("null == null") << QString() << QString(); + QTest::newRow("key == key") << QString("key") << QString("key"); + QTest::newRow("key1 == key1") << QString("key1") << QString("key1"); + QTest::newRow("key != key1") << QString("key") << QString("key1"); + QTest::newRow("ke1y != key1") << QString("ke1y") << QString("key1"); + QTest::newRow("key1 != key2") << QString("key1") << QString("key2"); +} + +void tst_QSharedMemory::uniqueKey() +{ + QFETCH(QString, key1); + QFETCH(QString, key2); + + QSharedMemory sm1(key1); + QSharedMemory sm2(key2); + + bool setEqual = (key1 == key2); + bool keyEqual = (sm1.key() == sm2.key()); + bool nativeEqual = (sm1.nativeKey() == sm2.nativeKey()); + + QCOMPARE(keyEqual, setEqual); + QCOMPARE(nativeEqual, setEqual); +} + QTEST_MAIN(tst_QSharedMemory) #include "tst_qsharedmemory.moc" -- cgit v0.12