IPC: make the two platformSafeKey functions return QNativeIpcKey

There's no need to return QString, only to create the QNativeIpcKey
elsewhere, when nothing uses this intermediary QString (those two
functions aren't used in unit tests any more, since the two "IPC: add
native key support" commits (2c286561bb
and 3ae052d3bb). Since they aren't used in
the tests, we can remove the Q_AUTOTEST_EXPORT macro too and the
unnecessary default argument.

I'll need the ability to return QNativeIpcKey to store the original,
legacy key inside of it.

Pick-to: 6.6 6.6.0
Change-Id: Idd5e1bb52be047d7b4fffffd17506c05e4f61f79
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Thiago Macieira 2023-03-27 17:57:13 -06:00
parent b2e5f70490
commit b5584ed224
4 changed files with 51 additions and 45 deletions

View File

@ -686,12 +686,12 @@ bool QSharedMemory::isKeyTypeSupported(QNativeIpcKey::Type type)
QNativeIpcKey QSharedMemory::platformSafeKey(const QString &key, QNativeIpcKey::Type type)
{
return { QtIpcCommon::platformSafeKey(key, IpcType::SharedMemory, type), type };
return QtIpcCommon::platformSafeKey(key, IpcType::SharedMemory, type);
}
QNativeIpcKey QSharedMemory::legacyNativeKey(const QString &key, QNativeIpcKey::Type type)
{
return { legacyPlatformSafeKey(key, IpcType::SharedMemory, type), type };
return QtIpcCommon::legacyPlatformSafeKey(key, IpcType::SharedMemory, type);
}
#endif // QT_CONFIG(sharedmemory)

View File

@ -406,12 +406,12 @@ bool QSystemSemaphore::isKeyTypeSupported(QNativeIpcKey::Type type)
QNativeIpcKey QSystemSemaphore::platformSafeKey(const QString &key, QNativeIpcKey::Type type)
{
return { QtIpcCommon::platformSafeKey(key, IpcType::SystemSemaphore, type), type };
return QtIpcCommon::platformSafeKey(key, IpcType::SystemSemaphore, type);
}
QNativeIpcKey QSystemSemaphore::legacyNativeKey(const QString &key, QNativeIpcKey::Type type)
{
return { legacyPlatformSafeKey(key, IpcType::SystemSemaphore, type), type };
return QtIpcCommon::legacyPlatformSafeKey(key, IpcType::SystemSemaphore, type);
}
QT_END_NAMESPACE

View File

@ -98,11 +98,12 @@ static QNativeIpcKey::Type stringToType(QStringView typeString)
On Unix this will be a file name
*/
QString QtIpcCommon::legacyPlatformSafeKey(const QString &key, QtIpcCommon::IpcType ipcType,
QNativeIpcKey::Type type)
QNativeIpcKey QtIpcCommon::legacyPlatformSafeKey(const QString &key, QtIpcCommon::IpcType ipcType,
QNativeIpcKey::Type type)
{
QNativeIpcKey k(type);
if (key.isEmpty())
return QString();
return k;
QByteArray hex = QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Sha1).toHex();
@ -113,13 +114,15 @@ QString QtIpcCommon::legacyPlatformSafeKey(const QString &key, QtIpcCommon::IpcT
// to be in the form <application group identifier>/<custom identifier>.
// Since we don't know which application group identifier the user wants
// to apply, we instead document that requirement, and use the key directly.
return key;
k.setNativeKey(key);
} else {
// The shared memory name limit on Apple platforms is very low (30 characters),
// so we can't use the logic below of combining the prefix, key, and a hash,
// to ensure a unique and valid name. Instead we use the first part of the
// hash, which should still long enough to avoid collisions in practice.
k.setNativeKey(u'/' + QLatin1StringView(hex).left(SHM_NAME_MAX - 1));
}
// The shared memory name limit on Apple platforms is very low (30 characters),
// so we can't use the logic below of combining the prefix, key, and a hash,
// to ensure a unique and valid name. Instead we use the first part of the
// hash, which should still long enough to avoid collisions in practice.
return u'/' + QLatin1StringView(hex).left(SHM_NAME_MAX - 1);
return k;
#endif
}
@ -143,38 +146,41 @@ QString QtIpcCommon::legacyPlatformSafeKey(const QString &key, QtIpcCommon::IpcT
switch (type) {
case QNativeIpcKey::Type::Windows:
if (!isIpcSupported(ipcType, QNativeIpcKey::Type::Windows))
return QString();
return result;
if (isIpcSupported(ipcType, QNativeIpcKey::Type::Windows))
k.setNativeKey(result);
return k;
case QNativeIpcKey::Type::PosixRealtime:
if (!isIpcSupported(ipcType, QNativeIpcKey::Type::PosixRealtime))
return QString();
return result.prepend(u'/');
if (isIpcSupported(ipcType, QNativeIpcKey::Type::PosixRealtime))
k.setNativeKey(result.prepend(u'/'));
return k;
case QNativeIpcKey::Type::SystemV:
break;
}
if (!isIpcSupported(ipcType, QNativeIpcKey::Type::SystemV))
return QString();
return QStandardPaths::writableLocation(QStandardPaths::TempLocation) + u'/' + result;
if (isIpcSupported(ipcType, QNativeIpcKey::Type::SystemV))
k.setNativeKey(QStandardPaths::writableLocation(QStandardPaths::TempLocation) + u'/' + result);
return k;
}
QString QtIpcCommon::platformSafeKey(const QString &key, QtIpcCommon::IpcType ipcType,
QNativeIpcKey::Type type)
QNativeIpcKey QtIpcCommon::platformSafeKey(const QString &key, QtIpcCommon::IpcType ipcType,
QNativeIpcKey::Type type)
{
QNativeIpcKey k(type);
if (key.isEmpty())
return key;
return k;
switch (type) {
case QNativeIpcKey::Type::PosixRealtime:
if (!isIpcSupported(ipcType, QNativeIpcKey::Type::PosixRealtime))
return QString();
if (isIpcSupported(ipcType, QNativeIpcKey::Type::PosixRealtime)) {
#ifdef SHM_NAME_MAX
// The shared memory name limit on Apple platforms is very low (30
// characters), so we have to cut it down to avoid ENAMETOOLONG. We
// hope that there won't be too many collisions...
return u'/' + QStringView(key).left(SHM_NAME_MAX - 1);
// The shared memory name limit on Apple platforms is very low (30
// characters), so we have to cut it down to avoid ENAMETOOLONG. We
// hope that there won't be too many collisions...
k.setNativeKey(u'/' + QStringView(key).left(SHM_NAME_MAX - 1));
#else
k.setNativeKey(u'/' + key);
#endif
return u'/' + key;
}
return k;
case QNativeIpcKey::Type::Windows:
if (isIpcSupported(ipcType, QNativeIpcKey::Type::Windows)) {
@ -199,22 +205,24 @@ QString QtIpcCommon::platformSafeKey(const QString &key, QtIpcCommon::IpcType ip
#ifdef Q_OS_WINDOWS
result.truncate(MAX_PATH);
#endif
return result;
k.setNativeKey(result);
}
return QString();
return k;
case QNativeIpcKey::Type::SystemV:
break;
}
// System V
if (!isIpcSupported(ipcType, QNativeIpcKey::Type::SystemV))
return QString();
if (key.startsWith(u'/'))
return key;
QString baseDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
return baseDir + u'/' + key;
if (isIpcSupported(ipcType, QNativeIpcKey::Type::SystemV)) {
if (key.startsWith(u'/')) {
k.setNativeKey(key);
} else {
QString baseDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
k.setNativeKey(baseDir + u'/' + key);
}
}
return k;
}
/*!

View File

@ -136,10 +136,8 @@ public:
}
};
Q_AUTOTEST_EXPORT QString
legacyPlatformSafeKey(const QString &key, IpcType ipcType,
QNativeIpcKey::Type type = QNativeIpcKey::legacyDefaultTypeForOs());
Q_AUTOTEST_EXPORT QString platformSafeKey(const QString &key, IpcType ipcType, QNativeIpcKey::Type type);
QNativeIpcKey legacyPlatformSafeKey(const QString &key, IpcType ipcType, QNativeIpcKey::Type type);
QNativeIpcKey platformSafeKey(const QString &key, IpcType ipcType, QNativeIpcKey::Type type);
#ifdef Q_OS_UNIX
// Convenience function to create the file if needed