Index: /trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.cpp	(revision 68096)
+++ /trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.cpp	(revision 68097)
@@ -453,5 +453,6 @@
                         pwszField,
 #else
-                        L"XXX" /* Don't show any actual values in release mode. */,
+                        /* Don't show any passwords in release mode. */
+                        dwFieldID == VBOXCREDPROV_FIELDID_PASSWORD ? L"XXX" : pwszField,
 #endif
                         fNotifyUI, hr);
@@ -565,9 +566,7 @@
     }
 
-    /* If credentials already were retrieved (also by a former call), don't try to retrieve new ones
-     * and just report back the already retrieved ones. */
     if (m_fHaveCreds)
     {
-        VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Credentials already retrieved\n");
+        VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Setting fields\n");
 
         setField(VBOXCREDPROV_FIELDID_USERNAME,   pwszUser,     true /* fNotifyUI */);
@@ -881,21 +880,29 @@
 {
     HRESULT hr;
-    if (   dwFieldID < VBOXCREDPROV_NUM_FIELDS
-        && ppwszString)
+
+    PWSTR pwszString = NULL;
+
+    if (dwFieldID < VBOXCREDPROV_NUM_FIELDS)
     {
         switch (dwFieldID)
         {
             case VBOXCREDPROV_FIELDID_SUBMIT_BUTTON:
+            {
                 /* Fill in standard value to make Winlogon happy. */
-                hr = SHStrDupW(L"Submit", ppwszString);
+                hr = SHStrDupW(L"Submit", &pwszString);
                 break;
+            }
 
             default:
+            {
                 if (   m_apwszFields[dwFieldID]
                     && RTUtf16Len(m_apwszFields[dwFieldID]))
-                    hr = SHStrDupW(m_apwszFields[dwFieldID], ppwszString);
+                {
+                    hr = SHStrDupW(m_apwszFields[dwFieldID], &pwszString);
+                }
                 else /* Fill in an empty value. */
-                    hr = SHStrDupW(L"", ppwszString);
+                    hr = SHStrDupW(L"", &pwszString);
                 break;
+            }
         }
     }
@@ -903,12 +910,21 @@
         hr = E_INVALIDARG;
 
-    VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetStringValue: m_fIsSelected=%RTbool, dwFieldID=%ld, ppwszString=%ls, hr=%Rhrc\n",
+    VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetStringValue: m_fIsSelected=%RTbool, dwFieldID=%ld, pwszString=%ls, hr=%Rhrc\n",
                         m_fIsSelected, dwFieldID,
 #ifdef DEBUG
-                        ppwszString ? *ppwszString : L"<NULL>",
-#else /* Never show any (sensitive) data in release mode! */
-                        L"XXX",
+                        pwszString ? pwszString : L"<NULL>",
+#else
+                        /* Don't show any passwords in release mode. */
+                        dwFieldID == VBOXCREDPROV_FIELDID_PASSWORD ? L"XXX" : (pwszString ? pwszString : L"<NULL>"),
 #endif
                         hr);
+
+    if (ppwszString)
+    {
+        *ppwszString = pwszString;
+    }
+    else if (pwszString)
+        CoTaskMemFree(pwszString);
+
     return hr;
 }
