From 992234e0ad95f014e340792da24ed65a1f7adb8f Mon Sep 17 00:00:00 2001
From: Ray Molenkamp <github@lazydodo.com>
Date: Wed, 15 Nov 2023 18:32:45 +0100
Subject: [PATCH] Fix #114906 invalid reuse of shell_link

shell_link was being reused, sometimes returning the previous
data causing links that were not ours to be updated.

Co-authored-by: Harley Acheson <harley.acheson@gmail.com>
Pull Request: https://projects.blender.org/blender/blender/pulls/114924
---
 .../blenlib/intern/winstuff_registration.cc   | 22 ++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/source/blender/blenlib/intern/winstuff_registration.cc b/source/blender/blenlib/intern/winstuff_registration.cc
index de215ef50eb..b73b14eecb4 100644
--- a/source/blender/blenlib/intern/winstuff_registration.cc
+++ b/source/blender/blenlib/intern/winstuff_registration.cc
@@ -58,17 +58,19 @@ bool BLI_windows_update_pinned_launcher(const char *launcher_path)
   std::wstring search_path = quick_launch_folder_path;
   CoTaskMemFree(quick_launch_folder_path);
 
-  Microsoft::WRL::ComPtr<IShellLinkW> shell_link;
-  if (CoCreateInstance(__uuidof(ShellLink), NULL, CLSCTX_ALL, IID_PPV_ARGS(&shell_link)) != S_OK) {
-    return false;
-  }
+  for (auto const &dir_entry : std::filesystem::recursive_directory_iterator(search_path)) {
 
-  Microsoft::WRL::ComPtr<IPersistFile> persist_file;
-  if (shell_link.As(&persist_file) != S_OK) {
-    return false;
-  }
+    Microsoft::WRL::ComPtr<IShellLinkW> shell_link;
+    if (CoCreateInstance(__uuidof(ShellLink), NULL, CLSCTX_ALL, IID_PPV_ARGS(&shell_link)) != S_OK)
+    {
+      return false;
+    }
+
+    Microsoft::WRL::ComPtr<IPersistFile> persist_file;
+    if (shell_link.As(&persist_file) != S_OK) {
+      return false;
+    }
 
-  for (auto const &dir_entry : std::filesystem::recursive_directory_iterator(search_path)) {
     if (persist_file->Load(dir_entry.path().c_str(), STGM_READWRITE) != S_OK) {
       continue;
     }
@@ -82,7 +84,7 @@ bool BLI_windows_update_pinned_launcher(const char *launcher_path)
     PROPVARIANT app_model;
     PropVariantInit(&app_model);
     if (property_store->GetValue(PKEY_AppUserModel_ID, &app_model) == S_OK) {
-      if (std::wstring(BLENDER_WIN_APPID_16) == app_model.bstrVal) {
+      if (app_model.vt == VT_LPWSTR && std::wstring(BLENDER_WIN_APPID_16) == app_model.pwszVal) {
         shell_link->SetPath(launcher_path_w);
         persist_file->Save(NULL, TRUE);
       }
-- 
GitLab