Index: JwsclCredentials.pas
===================================================================
--- JwsclCredentials.pas	(revision 1026)
+++ JwsclCredentials.pas	(working copy)
@@ -420,123 +420,134 @@
       RsUNCredentialsEmptyServerName, 'ShowModal',
       ClassName, RsUNCredentials, 0, False, []);
 
-  GetMem(pUser, CRED_MAX_USERNAME_LENGTH * sizeof(TJwChar));
+  lResult := NO_ERROR;
 
-  hRes := {$IFDEF UNICODE}StringCchCopyW{$ELSE}StringCchCopyA{$ENDIF}
-    (pUser, CRED_MAX_USERNAME_LENGTH, TJwPChar(fUserName));
+  pUser := nil;
+  pPass := nil;
+  try
+    GetMem(pUser, CRED_MAX_USERNAME_LENGTH * sizeof(TJwChar));
 
-  if FAILED(hRes) then
-  begin
-    raise EJwsclInvalidParameterException.CreateFmtEx(
-      'Property %0:s must be between %1:d and %2:d.', 'ShowModal',
-      ClassName, RsUNCredentials, 0, hRes, ['UserName', 0, CRED_MAX_USERNAME_LENGTH]);
-  end;
+    hRes := {$IFDEF UNICODE}StringCchCopyW{$ELSE}StringCchCopyA{$ENDIF}
+      (pUser, CRED_MAX_USERNAME_LENGTH, TJwPChar(fUserName));
 
-  GetMem(pPass, CREDUI_MAX_PASSWORD_LENGTH * sizeof(TJwChar));
+    if FAILED(hRes) then
+    begin
+      raise EJwsclInvalidParameterException.CreateFmtEx(
+        'Property %0:s must be between %1:d and %2:d.', 'ShowModal',
+        ClassName, RsUNCredentials, 0, hRes, ['UserName', 0, CRED_MAX_USERNAME_LENGTH]);
+    end;
 
-  hRes := {$IFDEF UNICODE}StringCchCopyW{$ELSE}StringCchCopyA{$ENDIF}
-    (pPass, CREDUI_MAX_PASSWORD_LENGTH, TJwPChar(fPassword));
-  if FAILED(hRes) then
-  begin
-    raise EJwsclInvalidParameterException.CreateFmtEx(
-      'Property %0:s must be between %1:d and %2:d.', 'ShowModal',
-      ClassName, RsUNCredentials, 0, hRes, ['Password', 0, CREDUI_MAX_PASSWORD_LENGTH]);
-  end;
+    GetMem(pPass, CREDUI_MAX_PASSWORD_LENGTH * sizeof(TJwChar));
 
-  FillChar(info, sizeof(info), 0);
-  info.cbSize := sizeof(info);
-  info.hwndParent := fParentWindow;
-  info.pszMessageText := TJwPChar(fMessageText);
-  info.pszCaptionText := TJwPChar(fCaption);
+    hRes := {$IFDEF UNICODE}StringCchCopyW{$ELSE}StringCchCopyA{$ENDIF}
+      (pPass, CREDUI_MAX_PASSWORD_LENGTH, TJwPChar(fPassword));
+    if FAILED(hRes) then
+    begin
+      raise EJwsclInvalidParameterException.CreateFmtEx(
+        'Property %0:s must be between %1:d and %2:d.', 'ShowModal',
+        ClassName, RsUNCredentials, 0, hRes, ['Password', 0, CREDUI_MAX_PASSWORD_LENGTH]);
+    end;
 
-  if Assigned(fBanner) then
-    info.hbmBanner := fBanner.Handle;
+    FillChar(info, sizeof(info), 0);
+    info.cbSize := sizeof(info);
+    info.hwndParent := fParentWindow;
+    info.pszMessageText := TJwPChar(fMessageText);
+    info.pszCaptionText := TJwPChar(fCaption);
 
-  aBool := fSaveCheck;
+    if Assigned(fBanner) then
+      info.hbmBanner := fBanner.Handle;
 
-  if (CommandLine) then
-  begin
-    tempFlag := fFlags;
-    //CredUICmdLinePromptForCredentials needs cfFlagsRequireSmartCard or cfFlagsExcludeCertificates
-    if not (cfFlagsRequireSmartCard in Flags)  then
-      Include(tempFlag, cfFlagsExcludeCertificates)
-    else
-      Exclude(tempFlag, cfFlagsExcludeCertificates);
+    aBool := fSaveCheck;
 
-    lResult :=
+    if (CommandLine) then
+    begin
+      tempFlag := fFlags;
+      //CredUICmdLinePromptForCredentials needs cfFlagsRequireSmartCard or cfFlagsExcludeCertificates
+      if not (cfFlagsRequireSmartCard in Flags)  then
+        Include(tempFlag, cfFlagsExcludeCertificates)
+      else
+        Exclude(tempFlag, cfFlagsExcludeCertificates);
+
+      lResult :=
 {$IFDEF UNICODE}
-      CredUICmdLinePromptForCredentialsW
+        CredUICmdLinePromptForCredentialsW
 {$ELSE}
-      CredUICmdLinePromptForCredentialsA
+        CredUICmdLinePromptForCredentialsA
 {$ENDIF}
-          (TJwPChar(fServerName),      //PCTSTR pszTargetName,
+            (TJwPChar(fServerName),      //PCTSTR pszTargetName,
+            nil,     //PCtxtHandle Reserved,
+            fAuthError,     //DWORD dwAuthError,
+            pUser,     //PCTSTR pszUserName,
+            CRED_MAX_USERNAME_LENGTH,     //ULONG ulUserNameMaxChars,
+            pPass,     //PCTSTR pszPassword,
+            CREDUI_MAX_PASSWORD_LENGTH,     //ULONG ulPasswordMaxChars,
+            @aBool,     //PBOOL pfSave,
+            TJwEnumMap.ConvertToCredentialFlag(tempFlag)     //DWORD dwFlags
+            );
+    end
+    else
+    begin
+      lResult :=
+{$IFDEF UNICODE}
+        CredUIPromptForCredentialsW
+{$ELSE}
+        CredUIPromptForCredentialsA
+{$ENDIF}
+          (@info,      //PCREDUI_INFO pUiInfo,
+          TJwPChar(fServerName),      //PCTSTR pszTargetName,
           nil,     //PCtxtHandle Reserved,
           fAuthError,     //DWORD dwAuthError,
           pUser,     //PCTSTR pszUserName,
           CRED_MAX_USERNAME_LENGTH,     //ULONG ulUserNameMaxChars,
           pPass,     //PCTSTR pszPassword,
           CREDUI_MAX_PASSWORD_LENGTH,     //ULONG ulPasswordMaxChars,
-          @aBool,     //PBOOL pfSave,
-          TJwEnumMap.ConvertToCredentialFlag(tempFlag)     //DWORD dwFlags
+          aBool,     //PBOOL pfSave,
+          TJwEnumMap.ConvertToCredentialFlag(fFlags)      //DWORD dwFlags
           );
-  end
-  else
-  begin
-    lResult :=
-{$IFDEF UNICODE}
-      CredUIPromptForCredentialsW
-{$ELSE}
-      CredUIPromptForCredentialsA
-{$ENDIF}
-        (@info,      //PCREDUI_INFO pUiInfo,
-        TJwPChar(fServerName),      //PCTSTR pszTargetName,
-        nil,     //PCtxtHandle Reserved,
-        fAuthError,     //DWORD dwAuthError,
-        pUser,     //PCTSTR pszUserName,
-        CRED_MAX_USERNAME_LENGTH,     //ULONG ulUserNameMaxChars,
-        pPass,     //PCTSTR pszPassword,
-        CREDUI_MAX_PASSWORD_LENGTH,     //ULONG ulPasswordMaxChars,
-        aBool,     //PBOOL pfSave,
-        TJwEnumMap.ConvertToCredentialFlag(fFlags)      //DWORD dwFlags
-        );
 
-  end;
+    end;
 
-  if (lResult <> NO_ERROR) then
-  begin
-    FreeMem(pUser);
-    FreeMem(pPass);
-    SetLastError(lResult);
+    if (lResult <> NO_ERROR) then
+    begin
+      SetLastError(lResult);
 
-    case lResult of
-      ERROR_INVALID_FLAGS:
-        raise EJwsclInvalidFlagsException.CreateFmtEx(
-          RsUNCredentialsInvalidPropertyFlags, 'ShowModal', ClassName, RsUNCredentials,
-          0, true, []);
-      ERROR_INVALID_PARAMETER:
-        raise EJwsclInvalidParameterException.CreateFmtEx(
-          RsUNCredentialsInvalidParametersCUIPFC, 'ShowModal',
-          ClassName, RsUNCredentials, 0, true, []);
-      ERROR_NO_SUCH_LOGON_SESSION: raise EJwsclNoSuchLogonSession.CreateFmtEx(
-          RsUNCredentialsInvalidLogonSession, 'ShowModal', ClassName, RsUNCredentials,
-          0, true, []);
+      case lResult of
+        ERROR_CANCELLED: ; // User chose Cancel. The user name and password have not changed.
+        ERROR_INVALID_FLAGS:
+          raise EJwsclInvalidFlagsException.CreateFmtEx(
+            RsUNCredentialsInvalidPropertyFlags, 'ShowModal', ClassName, RsUNCredentials,
+            0, true, []);
+        ERROR_INVALID_PARAMETER:
+          raise EJwsclInvalidParameterException.CreateFmtEx(
+            RsUNCredentialsInvalidParametersCUIPFC, 'ShowModal',
+            ClassName, RsUNCredentials, 0, true, []);
+        ERROR_NO_SUCH_LOGON_SESSION: raise EJwsclNoSuchLogonSession.CreateFmtEx(
+            RsUNCredentialsInvalidLogonSession, 'ShowModal', ClassName, RsUNCredentials,
+            0, true, []);
+      else
+        raise EJwsclWinCallFailedException.CreateFmtWinCall(
+            RsWinCallFailed, 'ShowModal', ClassName, RsUNCredentials,
+            0, true, 'CredUIPromptForCredentials',['CredUIPromptForCredentials']);
+      end;
+    end
     else
-      raise EJwsclWinCallFailedException.CreateFmtWinCall(
-          RsWinCallFailed, 'ShowModal', ClassName, RsUNCredentials,
-          0, true, 'CredUIPromptForCredentials',['CredUIPromptForCredentials']);
+    if (lResult = NO_ERROR) then
+    begin
+      fUserName := TJwString(pUser);
+      fPassword := TJwString(pPass);
     end;
-  end
-  else
-  if (lResult = NO_ERROR) then
-  begin
-    fUserName := TJwString(pUser);
-    fPassword := TJwString(pPass);
+  finally
+    if Assigned(pUser) then
+    begin
+      ZeroMemory(pUser, CRED_MAX_USERNAME_LENGTH * SizeOf(TJwChar));
+      FreeMem(pUser);        
+    end;
 
-    ZeroMemory(pUser, CRED_MAX_USERNAME_LENGTH * SizeOf(TJwChar));
-    ZeroMemory(pPass, CREDUI_MAX_PASSWORD_LENGTH * SizeOf(TJwChar));
-
-    FreeMem(pUser);
-    FreeMem(pPass);
+    if Assigned(pPass) then
+    begin
+      ZeroMemory(pPass, CREDUI_MAX_PASSWORD_LENGTH * SizeOf(TJwChar));
+      FreeMem(pPass);
+    end;    
   end;
 
   fSaveCheck := aBool;
@@ -550,7 +561,7 @@
 
     if (
   {$IFDEF UNICODE}
-     CredUIConfirmCredentialsW
+      CredUIConfirmCredentialsW
   {$ELSE}
       CredUIConfirmCredentialsA
   {$ENDIF}
