Create std::wstrings out of const wchar_t* so a copy is created every time.
authorallexzander <blackslayer4@gmail.com>
Fri, 2 Apr 2021 08:51:09 +0000 (11:51 +0300)
committerallexzander <blackslayer4@gmail.com>
Tue, 6 Apr 2021 07:03:22 +0000 (10:03 +0300)
Signed-off-by: allexzander <blackslayer4@gmail.com>
src/libsync/vfs/cfapi/cfapiwrapper.cpp
src/libsync/vfs/cfapi/cfapiwrapper.h

index a2e0584b46ff830a80b28f3134bc973c8dff7b54..0b09fd2ee79204d43b1400fb55f25c0656a7a78e 100644 (file)
@@ -450,7 +450,7 @@ bool deleteSyncRootRegistryKey(const QString &syncRootPath, const QString &provi
     return true;
 }
 
-OCC::Result<void, QString> OCC::CfApiWrapper::registerSyncRoot(const QString path, const QString providerName, const QString providerVersion, const QString folderAlias, const QString displayName, const QString accountDisplayName)
+OCC::Result<void, QString> OCC::CfApiWrapper::registerSyncRoot(const QString &path, const QString &providerName, const QString &providerVersion, const QString &folderAlias, const QString &displayName, const QString &accountDisplayName)
 {
     // even if we fail to register our sync root with shell, we can still proceed with using the VFS
     const auto createRegistryKeyResult = createSyncRootRegistryKeys(providerName, folderAlias, displayName, accountDisplayName, path);
@@ -460,9 +460,11 @@ OCC::Result<void, QString> OCC::CfApiWrapper::registerSyncRoot(const QString pat
         qCWarning(lcCfApiWrapper) << "Failed to create the registry key for path:" << path;
     }
 
-    const auto p = path.toStdWString();
-    const auto name = providerName.toStdWString();
-    const auto version = providerVersion.toStdWString();
+    // API is somehow keeping the pointers for longer than one would expect or freeing them itself
+    // the internal format of QString is likely the right one for wstring on Windows so there's in fact not necessarily a need to copy
+    const auto p = std::wstring(path.toStdWString().data());
+    const auto name = std::wstring(providerName.toStdWString().data());
+    const auto version = std::wstring(providerVersion.toStdWString().data());
 
     CF_SYNC_REGISTRATION info;
     info.ProviderName = name.data();
@@ -489,7 +491,7 @@ OCC::Result<void, QString> OCC::CfApiWrapper::registerSyncRoot(const QString pat
     }
 }
 
-OCC::Result<void, QString> OCC::CfApiWrapper::unregisterSyncRoot(const QString path, const QString providerName, const QString accountDisplayName)
+OCC::Result<void, QString> OCC::CfApiWrapper::unregisterSyncRoot(const QString &path, const QString &providerName, const QString &accountDisplayName)
 {
     const auto deleteRegistryKeyResult = deleteSyncRootRegistryKey(path, providerName, accountDisplayName);
     Q_ASSERT(deleteRegistryKeyResult);
index f315921d3d9a741a7c5a2a639d086e46cfc3a902..2e8810b45e8ea273d6eae7a8afffc87f6f452e94 100644 (file)
@@ -71,8 +71,8 @@ private:
     std::unique_ptr<CF_PLACEHOLDER_BASIC_INFO, Deleter> _data;
 };
 
-OWNCLOUDSYNC_EXPORT Result<void, QString> registerSyncRoot(const QString path, const QString providerName, const QString providerVersion, const QString folderAlias, const QString displayName, const QString accountDisplayName);
-OWNCLOUDSYNC_EXPORT Result<void, QString> unregisterSyncRoot(const QString path, const QString providerName, const QString accountDisplayName);
+OWNCLOUDSYNC_EXPORT Result<void, QString> registerSyncRoot(const QString &path, const QString &providerName, const QString &providerVersion, const QString &folderAlias, const QString &displayName, const QString &accountDisplayName);
+OWNCLOUDSYNC_EXPORT Result<void, QString> unregisterSyncRoot(const QString &path, const QString &providerName, const QString &accountDisplayName);
 
 OWNCLOUDSYNC_EXPORT Result<ConnectionKey, QString> connectSyncRoot(const QString &path, VfsCfApi *context);
 OWNCLOUDSYNC_EXPORT Result<void, QString> disconnectSyncRoot(ConnectionKey &&key);