Bug 1296218 - Clean up PK11PasswordPromptRunnable::RunOnTargetThread(). r=keeler
MozReview-Commit-ID: Bhp192YgldD
--- a/security/manager/ssl/nsNSSCallbacks.cpp
+++ b/security/manager/ssl/nsNSSCallbacks.cpp
@@ -2,16 +2,17 @@
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsNSSCallbacks.h"
#include "mozilla/ArrayUtils.h"
+#include "mozilla/Assertions.h"
#include "mozilla/Casting.h"
#include "mozilla/Telemetry.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/unused.h"
#include "nsContentUtils.h"
#include "nsICertOverrideService.h"
#include "nsIHttpChannelInternal.h"
#include "nsIPrompt.h"
@@ -747,79 +748,82 @@ PK11PasswordPromptRunnable::~PK11Passwor
nsNSSShutDownPreventionLock locker;
if (isAlreadyShutDown()) {
return;
}
shutdown(calledFromObject);
}
-void PK11PasswordPromptRunnable::RunOnTargetThread()
+void
+PK11PasswordPromptRunnable::RunOnTargetThread()
{
static NS_DEFINE_CID(kNSSComponentCID, NS_NSSCOMPONENT_CID);
nsNSSShutDownPreventionLock locker;
if (isAlreadyShutDown()) {
return;
}
- nsresult rv = NS_OK;
- char16_t *password = nullptr;
- bool value = false;
+ nsresult rv;
nsCOMPtr<nsIPrompt> prompt;
-
- if (!mIR)
- {
- nsNSSComponent::GetNewPrompter(getter_AddRefs(prompt));
- }
- else
- {
+ if (!mIR) {
+ rv = nsNSSComponent::GetNewPrompter(getter_AddRefs(prompt));
+ if (NS_FAILED(rv)) {
+ return;
+ }
+ } else {
prompt = do_GetInterface(mIR);
- NS_ASSERTION(prompt, "callbacks does not implement nsIPrompt");
+ MOZ_ASSERT(prompt, "Interface requestor should implement nsIPrompt");
}
- if (!prompt)
+ if (!prompt) {
return;
+ }
if (PK11_ProtectedAuthenticationPath(mSlot)) {
mResult = ShowProtectedAuthPrompt(mSlot, mIR);
return;
}
- nsAutoString promptString;
- nsCOMPtr<nsINSSComponent> nssComponent(do_GetService(kNSSComponentCID, &rv));
-
- if (NS_FAILED(rv))
- return;
-
- const char16_t* formatStrings[1] = {
- ToNewUnicode(NS_ConvertUTF8toUTF16(PK11_GetTokenName(mSlot)))
- };
- rv = nssComponent->PIPBundleFormatStringFromName("CertPassPrompt",
- formatStrings, 1,
- promptString);
- free(const_cast<char16_t*>(formatStrings[0]));
+ nsCOMPtr<nsINSSComponent> nssComponent(do_GetService(kNSSComponentCID));
+ if (!nssComponent) {
+ return;
+ }
- if (NS_FAILED(rv))
+ NS_ConvertUTF8toUTF16 tokenName(PK11_GetTokenName(mSlot));
+ const char16_t* formatStrings[] = {
+ tokenName.get(),
+ };
+ nsAutoString promptString;
+ rv = nssComponent->PIPBundleFormatStringFromName("CertPassPrompt",
+ formatStrings,
+ ArrayLength(formatStrings),
+ promptString);
+ if (NS_FAILED(rv)) {
return;
+ }
- // Although the exact value is ignored, we must not pass invalid bool values
- // through XPConnect.
+ nsXPIDLString password;
+ // |checkState| is unused because |checkMsg| (the argument just before it) is
+ // null, but XPConnect requires it to point to a valid bool nonetheless.
bool checkState = false;
- rv = prompt->PromptPassword(nullptr, promptString.get(), &password, nullptr,
- &checkState, &value);
-
- if (NS_SUCCEEDED(rv) && value) {
- mResult = ToNewUTF8String(nsDependentString(password));
- free(password);
+ bool userClickedOK = false;
+ rv = prompt->PromptPassword(nullptr, promptString.get(),
+ getter_Copies(password), nullptr, &checkState,
+ &userClickedOK);
+ if (NS_FAILED(rv) || !userClickedOK) {
+ return;
}
+
+ mResult = ToNewUTF8String(password);
}
char*
-PK11PasswordPrompt(PK11SlotInfo* slot, PRBool retry, void* arg)
+PK11PasswordPrompt(PK11SlotInfo* slot, PRBool /*retry*/, void* arg)
{
RefPtr<PK11PasswordPromptRunnable> runnable(
new PK11PasswordPromptRunnable(slot,
static_cast<nsIInterfaceRequestor*>(arg)));
runnable->DispatchToMainThreadAndWait();
return runnable->mResult;
}