Bug Summary

File:var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp
Warning:line 267, column 5
Value stored to 'rv' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Unified_cpp_netwerk_base1.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/netwerk/base -fcoverage-compilation-dir=/var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/netwerk/base -resource-dir /usr/lib/llvm-20/lib/clang/20 -include /var/lib/jenkins/workspace/firefox-scan-build/config/gcc_hidden.h -include /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/dist/stl_wrappers -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D _GLIBCXX_ASSERTIONS -D DEBUG=1 -D MOZ_HAS_MOZGLUE -D MOZILLA_INTERNAL_API -D IMPL_LIBXUL -D MOZ_SUPPORT_LEAKCHECKING -D STATIC_EXPORTABLE_JS_API -I /var/lib/jenkins/workspace/firefox-scan-build/netwerk/base -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/netwerk/base -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/ipc/ipdl/_ipdlheaders -I /var/lib/jenkins/workspace/firefox-scan-build/ipc/chromium/src -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/xpcom/components -I /var/lib/jenkins/workspace/firefox-scan-build/docshell/base -I /var/lib/jenkins/workspace/firefox-scan-build/dom/base -I /var/lib/jenkins/workspace/firefox-scan-build/js/xpconnect/src -I /var/lib/jenkins/workspace/firefox-scan-build/netwerk/dns -I /var/lib/jenkins/workspace/firefox-scan-build/netwerk/protocol/http -I /var/lib/jenkins/workspace/firefox-scan-build/netwerk/protocol/webtransport -I /var/lib/jenkins/workspace/firefox-scan-build/netwerk/socket -I /var/lib/jenkins/workspace/firefox-scan-build/netwerk/url-classifier -I /var/lib/jenkins/workspace/firefox-scan-build/security/manager/ssl -I /var/lib/jenkins/workspace/firefox-scan-build/xpcom/components -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/dist/include -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /var/lib/jenkins/workspace/firefox-scan-build/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/x86_64-linux-gnu/c++/14 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/backward -internal-isystem /usr/lib/llvm-20/lib/clang/20/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-error=tautological-type-limit-compare -Wno-invalid-offsetof -Wno-range-loop-analysis -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-deprecated-this-capture -Wno-inline-new-delete -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-vla-cxx-extension -Wno-unknown-warning-option -fdeprecated-macro -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fno-rtti -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fno-sized-deallocation -fno-aligned-allocation -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2025-01-20-090804-167946-1 -x c++ Unified_cpp_netwerk_base1.cpp
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2/* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6#include "mozilla/Logging.h"
7#include "mozilla/SpinEventLoopUntil.h"
8#include "nsAsyncRedirectVerifyHelper.h"
9#include "nsThreadUtils.h"
10#include "nsNetUtil.h"
11
12#include "nsIOService.h"
13#include "nsIChannel.h"
14#include "nsIHttpChannelInternal.h"
15#include "nsIAsyncVerifyRedirectCallback.h"
16#include "nsILoadInfo.h"
17
18namespace mozilla {
19namespace net {
20
21static LazyLogModule gRedirectLog("nsRedirect");
22#undef LOG
23#define LOG(args)do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, MOZ_LOG_EXPAND_ARGS args); } } while (0)
MOZ_LOG(gRedirectLog, LogLevel::Debug, args)do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, MOZ_LOG_EXPAND_ARGS args); } } while (0)
24
25NS_IMPL_ISUPPORTS(nsAsyncRedirectVerifyHelper, nsIAsyncVerifyRedirectCallback,MozExternalRefCountType nsAsyncRedirectVerifyHelper::AddRef(void
) { static_assert(!std::is_destructible_v<nsAsyncRedirectVerifyHelper
>, "Reference-counted class " "nsAsyncRedirectVerifyHelper"
" should not have a public destructor. " "Make this class's destructor non-public"
); do { static_assert( mozilla::detail::AssertionConditionType
<decltype(int32_t(mRefCnt) >= 0)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(int32_t(mRefCnt) >= 0))),
0))) { do { } while (false); MOZ_ReportAssertionFailure("int32_t(mRefCnt) >= 0"
" (" "illegal refcnt" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "int32_t(mRefCnt) >= 0"
") (" "illegal refcnt" ")"); do { *((volatile int*)__null) =
26; __attribute__((nomerge)) ::abort(); } while (false); } }
while (false); do { static_assert( mozilla::detail::AssertionConditionType
<decltype("nsAsyncRedirectVerifyHelper" != nullptr)>::isValid
, "invalid assertion condition"); if ((__builtin_expect(!!(!(
!!("nsAsyncRedirectVerifyHelper" != nullptr))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("\"nsAsyncRedirectVerifyHelper\" != nullptr"
" (" "Must specify a name" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "\"nsAsyncRedirectVerifyHelper\" != nullptr"
") (" "Must specify a name" ")"); do { *((volatile int*)__null
) = 26; __attribute__((nomerge)) ::abort(); } while (false); }
} while (false); if (!mRefCnt.isThreadSafe) _mOwningThread.AssertOwnership
("nsAsyncRedirectVerifyHelper" " not thread-safe"); nsrefcnt count
= ++mRefCnt; NS_LogAddRef((this), (count), ("nsAsyncRedirectVerifyHelper"
), (uint32_t)(sizeof(*this))); return count; } MozExternalRefCountType
nsAsyncRedirectVerifyHelper::Release(void) { do { static_assert
( mozilla::detail::AssertionConditionType<decltype(int32_t
(mRefCnt) > 0)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(int32_t(mRefCnt) > 0))), 0
))) { do { } while (false); MOZ_ReportAssertionFailure("int32_t(mRefCnt) > 0"
" (" "dup release" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "int32_t(mRefCnt) > 0"
") (" "dup release" ")"); do { *((volatile int*)__null) = 26
; __attribute__((nomerge)) ::abort(); } while (false); } } while
(false); do { static_assert( mozilla::detail::AssertionConditionType
<decltype("nsAsyncRedirectVerifyHelper" != nullptr)>::isValid
, "invalid assertion condition"); if ((__builtin_expect(!!(!(
!!("nsAsyncRedirectVerifyHelper" != nullptr))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("\"nsAsyncRedirectVerifyHelper\" != nullptr"
" (" "Must specify a name" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "\"nsAsyncRedirectVerifyHelper\" != nullptr"
") (" "Must specify a name" ")"); do { *((volatile int*)__null
) = 26; __attribute__((nomerge)) ::abort(); } while (false); }
} while (false); if (!mRefCnt.isThreadSafe) _mOwningThread.AssertOwnership
("nsAsyncRedirectVerifyHelper" " not thread-safe"); const char
* const nametmp = "nsAsyncRedirectVerifyHelper"; nsrefcnt count
= --mRefCnt; NS_LogRelease((this), (count), (nametmp)); if (
count == 0) { mRefCnt = 1; delete (this); return 0; } return count
; } nsresult nsAsyncRedirectVerifyHelper::QueryInterface(const
nsIID& aIID, void** aInstancePtr) { do { if (!(aInstancePtr
)) { NS_DebugBreak(NS_DEBUG_ASSERTION, "QueryInterface requires a non-NULL destination!"
, "aInstancePtr", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); MOZ_PretendNoReturn(); } } while (0); nsresult rv = NS_ERROR_FAILURE
; static_assert(3 > 0, "Need more arguments to NS_INTERFACE_TABLE"
); static const QITableEntry table[] = { {&mozilla::detail
::kImplementedIID<nsAsyncRedirectVerifyHelper, nsIAsyncVerifyRedirectCallback
>, int32_t( reinterpret_cast<char*>(static_cast<nsIAsyncVerifyRedirectCallback
*>((nsAsyncRedirectVerifyHelper*)0x1000)) - reinterpret_cast
<char*>((nsAsyncRedirectVerifyHelper*)0x1000))}, {&
mozilla::detail::kImplementedIID<nsAsyncRedirectVerifyHelper
, nsIRunnable>, int32_t( reinterpret_cast<char*>(static_cast
<nsIRunnable*>((nsAsyncRedirectVerifyHelper*)0x1000)) -
reinterpret_cast<char*>((nsAsyncRedirectVerifyHelper*)
0x1000))}, {&mozilla::detail::kImplementedIID<nsAsyncRedirectVerifyHelper
, nsINamed>, int32_t( reinterpret_cast<char*>(static_cast
<nsINamed*>((nsAsyncRedirectVerifyHelper*)0x1000)) - reinterpret_cast
<char*>((nsAsyncRedirectVerifyHelper*)0x1000))}, {&
mozilla::detail::kImplementedIID<nsAsyncRedirectVerifyHelper
, nsISupports>, int32_t(reinterpret_cast<char*>(static_cast
<nsISupports*>( static_cast<nsIAsyncVerifyRedirectCallback
*>((nsAsyncRedirectVerifyHelper*)0x1000))) - reinterpret_cast
<char*>((nsAsyncRedirectVerifyHelper*)0x1000))}, { nullptr
, 0 } } ; static_assert(std::size(table) > 1, "need at least 1 interface"
); rv = NS_TableDrivenQI(static_cast<void*>(this), aIID
, aInstancePtr, table); return rv; }
26 nsIRunnable, nsINamed)MozExternalRefCountType nsAsyncRedirectVerifyHelper::AddRef(void
) { static_assert(!std::is_destructible_v<nsAsyncRedirectVerifyHelper
>, "Reference-counted class " "nsAsyncRedirectVerifyHelper"
" should not have a public destructor. " "Make this class's destructor non-public"
); do { static_assert( mozilla::detail::AssertionConditionType
<decltype(int32_t(mRefCnt) >= 0)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(int32_t(mRefCnt) >= 0))),
0))) { do { } while (false); MOZ_ReportAssertionFailure("int32_t(mRefCnt) >= 0"
" (" "illegal refcnt" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "int32_t(mRefCnt) >= 0"
") (" "illegal refcnt" ")"); do { *((volatile int*)__null) =
26; __attribute__((nomerge)) ::abort(); } while (false); } }
while (false); do { static_assert( mozilla::detail::AssertionConditionType
<decltype("nsAsyncRedirectVerifyHelper" != nullptr)>::isValid
, "invalid assertion condition"); if ((__builtin_expect(!!(!(
!!("nsAsyncRedirectVerifyHelper" != nullptr))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("\"nsAsyncRedirectVerifyHelper\" != nullptr"
" (" "Must specify a name" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "\"nsAsyncRedirectVerifyHelper\" != nullptr"
") (" "Must specify a name" ")"); do { *((volatile int*)__null
) = 26; __attribute__((nomerge)) ::abort(); } while (false); }
} while (false); if (!mRefCnt.isThreadSafe) _mOwningThread.AssertOwnership
("nsAsyncRedirectVerifyHelper" " not thread-safe"); nsrefcnt count
= ++mRefCnt; NS_LogAddRef((this), (count), ("nsAsyncRedirectVerifyHelper"
), (uint32_t)(sizeof(*this))); return count; } MozExternalRefCountType
nsAsyncRedirectVerifyHelper::Release(void) { do { static_assert
( mozilla::detail::AssertionConditionType<decltype(int32_t
(mRefCnt) > 0)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(int32_t(mRefCnt) > 0))), 0
))) { do { } while (false); MOZ_ReportAssertionFailure("int32_t(mRefCnt) > 0"
" (" "dup release" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "int32_t(mRefCnt) > 0"
") (" "dup release" ")"); do { *((volatile int*)__null) = 26
; __attribute__((nomerge)) ::abort(); } while (false); } } while
(false); do { static_assert( mozilla::detail::AssertionConditionType
<decltype("nsAsyncRedirectVerifyHelper" != nullptr)>::isValid
, "invalid assertion condition"); if ((__builtin_expect(!!(!(
!!("nsAsyncRedirectVerifyHelper" != nullptr))), 0))) { do { }
while (false); MOZ_ReportAssertionFailure("\"nsAsyncRedirectVerifyHelper\" != nullptr"
" (" "Must specify a name" ")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); AnnotateMozCrashReason("MOZ_ASSERT" "(" "\"nsAsyncRedirectVerifyHelper\" != nullptr"
") (" "Must specify a name" ")"); do { *((volatile int*)__null
) = 26; __attribute__((nomerge)) ::abort(); } while (false); }
} while (false); if (!mRefCnt.isThreadSafe) _mOwningThread.AssertOwnership
("nsAsyncRedirectVerifyHelper" " not thread-safe"); const char
* const nametmp = "nsAsyncRedirectVerifyHelper"; nsrefcnt count
= --mRefCnt; NS_LogRelease((this), (count), (nametmp)); if (
count == 0) { mRefCnt = 1; delete (this); return 0; } return count
; } nsresult nsAsyncRedirectVerifyHelper::QueryInterface(const
nsIID& aIID, void** aInstancePtr) { do { if (!(aInstancePtr
)) { NS_DebugBreak(NS_DEBUG_ASSERTION, "QueryInterface requires a non-NULL destination!"
, "aInstancePtr", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 26); MOZ_PretendNoReturn(); } } while (0); nsresult rv = NS_ERROR_FAILURE
; static_assert(3 > 0, "Need more arguments to NS_INTERFACE_TABLE"
); static const QITableEntry table[] = { {&mozilla::detail
::kImplementedIID<nsAsyncRedirectVerifyHelper, nsIAsyncVerifyRedirectCallback
>, int32_t( reinterpret_cast<char*>(static_cast<nsIAsyncVerifyRedirectCallback
*>((nsAsyncRedirectVerifyHelper*)0x1000)) - reinterpret_cast
<char*>((nsAsyncRedirectVerifyHelper*)0x1000))}, {&
mozilla::detail::kImplementedIID<nsAsyncRedirectVerifyHelper
, nsIRunnable>, int32_t( reinterpret_cast<char*>(static_cast
<nsIRunnable*>((nsAsyncRedirectVerifyHelper*)0x1000)) -
reinterpret_cast<char*>((nsAsyncRedirectVerifyHelper*)
0x1000))}, {&mozilla::detail::kImplementedIID<nsAsyncRedirectVerifyHelper
, nsINamed>, int32_t( reinterpret_cast<char*>(static_cast
<nsINamed*>((nsAsyncRedirectVerifyHelper*)0x1000)) - reinterpret_cast
<char*>((nsAsyncRedirectVerifyHelper*)0x1000))}, {&
mozilla::detail::kImplementedIID<nsAsyncRedirectVerifyHelper
, nsISupports>, int32_t(reinterpret_cast<char*>(static_cast
<nsISupports*>( static_cast<nsIAsyncVerifyRedirectCallback
*>((nsAsyncRedirectVerifyHelper*)0x1000))) - reinterpret_cast
<char*>((nsAsyncRedirectVerifyHelper*)0x1000))}, { nullptr
, 0 } } ; static_assert(std::size(table) > 1, "need at least 1 interface"
); rv = NS_TableDrivenQI(static_cast<void*>(this), aIID
, aInstancePtr, table); return rv; }
27
28class nsAsyncVerifyRedirectCallbackEvent : public Runnable {
29 public:
30 nsAsyncVerifyRedirectCallbackEvent(nsIAsyncVerifyRedirectCallback* cb,
31 nsresult result)
32 : Runnable("nsAsyncVerifyRedirectCallbackEvent"),
33 mCallback(cb),
34 mResult(result) {}
35
36 NS_IMETHODvirtual nsresult Run() override {
37 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncVerifyRedirectCallbackEvent::Run() "
"callback to %p with result %" "x", mCallback.get(), static_cast
<uint32_t>(mResult)); } } while (0)
38 ("nsAsyncVerifyRedirectCallbackEvent::Run() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncVerifyRedirectCallbackEvent::Run() "
"callback to %p with result %" "x", mCallback.get(), static_cast
<uint32_t>(mResult)); } } while (0)
39 "callback to %p with result %" PRIx32,do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncVerifyRedirectCallbackEvent::Run() "
"callback to %p with result %" "x", mCallback.get(), static_cast
<uint32_t>(mResult)); } } while (0)
40 mCallback.get(), static_cast<uint32_t>(mResult)))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncVerifyRedirectCallbackEvent::Run() "
"callback to %p with result %" "x", mCallback.get(), static_cast
<uint32_t>(mResult)); } } while (0)
;
41 (void)mCallback->OnRedirectVerifyCallback(mResult);
42 return NS_OK;
43 }
44
45 private:
46 nsCOMPtr<nsIAsyncVerifyRedirectCallback> mCallback;
47 nsresult mResult;
48};
49
50nsAsyncRedirectVerifyHelper::~nsAsyncRedirectVerifyHelper() {
51 NS_ASSERTION(NS_FAILED(mResult) || mExpectedCallbacks == 0,do { if (!(((bool)(__builtin_expect(!!(NS_FAILED_impl(mResult
)), 0))) || mExpectedCallbacks == 0)) { NS_DebugBreak(NS_DEBUG_ASSERTION
, "Did not receive all required callbacks!", "NS_FAILED(mResult) || mExpectedCallbacks == 0"
, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 52); MOZ_PretendNoReturn(); } } while (0)
52 "Did not receive all required callbacks!")do { if (!(((bool)(__builtin_expect(!!(NS_FAILED_impl(mResult
)), 0))) || mExpectedCallbacks == 0)) { NS_DebugBreak(NS_DEBUG_ASSERTION
, "Did not receive all required callbacks!", "NS_FAILED(mResult) || mExpectedCallbacks == 0"
, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 52); MOZ_PretendNoReturn(); } } while (0)
;
53}
54
55nsresult nsAsyncRedirectVerifyHelper::Init(
56 nsIChannel* oldChan, nsIChannel* newChan, uint32_t flags,
57 nsIEventTarget* mainThreadEventTarget, bool synchronize) {
58 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::Init() " "oldChan=%p newChan=%p"
, oldChan, newChan); } } while (0)
59 ("nsAsyncRedirectVerifyHelper::Init() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::Init() " "oldChan=%p newChan=%p"
, oldChan, newChan); } } while (0)
60 "oldChan=%p newChan=%p",do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::Init() " "oldChan=%p newChan=%p"
, oldChan, newChan); } } while (0)
61 oldChan, newChan))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::Init() " "oldChan=%p newChan=%p"
, oldChan, newChan); } } while (0)
;
62 mOldChan = oldChan;
63 mNewChan = newChan;
64 mFlags = flags;
65 mCallbackEventTarget = NS_IsMainThread() && mainThreadEventTarget
66 ? mainThreadEventTarget
67 : GetCurrentSerialEventTarget();
68
69 if (!(flags & (nsIChannelEventSink::REDIRECT_INTERNAL |
70 nsIChannelEventSink::REDIRECT_STS_UPGRADE |
71 nsIChannelEventSink::REDIRECT_TRANSPARENT))) {
72 nsCOMPtr<nsILoadInfo> loadInfo = oldChan->LoadInfo();
73 if (loadInfo->GetDontFollowRedirects()) {
74 ExplicitCallback(NS_BINDING_ABORTED);
75 return NS_OK;
76 }
77 }
78
79 if (synchronize) mWaitingForRedirectCallback = true;
80
81 nsCOMPtr<nsIRunnable> runnable = this;
82 nsresult rv;
83 rv = mainThreadEventTarget
84 ? mainThreadEventTarget->Dispatch(runnable.forget())
85 : GetMainThreadSerialEventTarget()->Dispatch(runnable.forget());
86 NS_ENSURE_SUCCESS(rv, rv)do { nsresult __rv = rv; if (((bool)(__builtin_expect(!!(NS_FAILED_impl
(__rv)), 0)))) { const char* name = mozilla::GetStaticErrorName
(__rv); mozilla::SmprintfPointer msg = mozilla::Smprintf( "NS_ENSURE_SUCCESS(%s, %s) failed with "
"result 0x%" "X" "%s%s%s", "rv", "rv", static_cast<uint32_t
>(__rv), name ? " (" : "", name ? name : "", name ? ")" : ""
); NS_DebugBreak(NS_DEBUG_WARNING, msg.get(), nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 86); return rv; } } while (false)
;
87
88 if (synchronize) {
89 if (!SpinEventLoopUntil("nsAsyncRedirectVerifyHelper::Init"_ns,
90 [&]() { return !mWaitingForRedirectCallback; })) {
91 return NS_ERROR_UNEXPECTED;
92 }
93 }
94
95 return NS_OK;
96}
97
98NS_IMETHODIMPnsresult
99nsAsyncRedirectVerifyHelper::OnRedirectVerifyCallback(nsresult result) {
100 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::OnRedirectVerifyCallback() "
"result=%" "x" " expectedCBs=%u mResult=%" "x", static_cast<
uint32_t>(result), mExpectedCallbacks, static_cast<uint32_t
>(mResult)); } } while (0)
101 ("nsAsyncRedirectVerifyHelper::OnRedirectVerifyCallback() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::OnRedirectVerifyCallback() "
"result=%" "x" " expectedCBs=%u mResult=%" "x", static_cast<
uint32_t>(result), mExpectedCallbacks, static_cast<uint32_t
>(mResult)); } } while (0)
102 "result=%" PRIx32 " expectedCBs=%u mResult=%" PRIx32,do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::OnRedirectVerifyCallback() "
"result=%" "x" " expectedCBs=%u mResult=%" "x", static_cast<
uint32_t>(result), mExpectedCallbacks, static_cast<uint32_t
>(mResult)); } } while (0)
103 static_cast<uint32_t>(result), mExpectedCallbacks,do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::OnRedirectVerifyCallback() "
"result=%" "x" " expectedCBs=%u mResult=%" "x", static_cast<
uint32_t>(result), mExpectedCallbacks, static_cast<uint32_t
>(mResult)); } } while (0)
104 static_cast<uint32_t>(mResult)))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::OnRedirectVerifyCallback() "
"result=%" "x" " expectedCBs=%u mResult=%" "x", static_cast<
uint32_t>(result), mExpectedCallbacks, static_cast<uint32_t
>(mResult)); } } while (0)
;
105
106 MOZ_DIAGNOSTIC_ASSERT(do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mExpectedCallbacks > 0)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(mExpectedCallbacks > 0)))
, 0))) { do { } while (false); MOZ_ReportAssertionFailure("mExpectedCallbacks > 0"
" (" "OnRedirectVerifyCallback called more times than expected"
")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 108); AnnotateMozCrashReason("MOZ_DIAGNOSTIC_ASSERT" "(" "mExpectedCallbacks > 0"
") (" "OnRedirectVerifyCallback called more times than expected"
")"); do { *((volatile int*)__null) = 108; __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
107 mExpectedCallbacks > 0,do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mExpectedCallbacks > 0)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(mExpectedCallbacks > 0)))
, 0))) { do { } while (false); MOZ_ReportAssertionFailure("mExpectedCallbacks > 0"
" (" "OnRedirectVerifyCallback called more times than expected"
")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 108); AnnotateMozCrashReason("MOZ_DIAGNOSTIC_ASSERT" "(" "mExpectedCallbacks > 0"
") (" "OnRedirectVerifyCallback called more times than expected"
")"); do { *((volatile int*)__null) = 108; __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
108 "OnRedirectVerifyCallback called more times than expected")do { static_assert( mozilla::detail::AssertionConditionType<
decltype(mExpectedCallbacks > 0)>::isValid, "invalid assertion condition"
); if ((__builtin_expect(!!(!(!!(mExpectedCallbacks > 0)))
, 0))) { do { } while (false); MOZ_ReportAssertionFailure("mExpectedCallbacks > 0"
" (" "OnRedirectVerifyCallback called more times than expected"
")", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 108); AnnotateMozCrashReason("MOZ_DIAGNOSTIC_ASSERT" "(" "mExpectedCallbacks > 0"
") (" "OnRedirectVerifyCallback called more times than expected"
")"); do { *((volatile int*)__null) = 108; __attribute__((nomerge
)) ::abort(); } while (false); } } while (false)
;
109 if (mExpectedCallbacks <= 0) {
110 return NS_ERROR_UNEXPECTED;
111 }
112
113 --mExpectedCallbacks;
114
115 // If response indicates failure we may call back immediately
116 if (NS_FAILED(result)((bool)(__builtin_expect(!!(NS_FAILED_impl(result)), 0)))) {
117 // We chose to store the first failure-value (as opposed to the last)
118 if (NS_SUCCEEDED(mResult)((bool)(__builtin_expect(!!(!NS_FAILED_impl(mResult)), 1)))) mResult = result;
119
120 // If InitCallback() has been called, just invoke the callback and
121 // return. Otherwise it will be invoked from InitCallback()
122 if (mCallbackInitiated) {
123 ExplicitCallback(mResult);
124 return NS_OK;
125 }
126 }
127
128 // If the expected-counter is in balance and InitCallback() was called, all
129 // sinks have agreed that the redirect is ok and we can invoke our callback
130 if (mCallbackInitiated && mExpectedCallbacks == 0) {
131 ExplicitCallback(mResult);
132 }
133
134 return NS_OK;
135}
136
137nsresult nsAsyncRedirectVerifyHelper::DelegateOnChannelRedirect(
138 nsIChannelEventSink* sink, nsIChannel* oldChannel, nsIChannel* newChannel,
139 uint32_t flags) {
140 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::DelegateOnChannelRedirect() "
"sink=%p expectedCBs=%u mResult=%" "x", sink, mExpectedCallbacks
, static_cast<uint32_t>(mResult)); } } while (0)
141 ("nsAsyncRedirectVerifyHelper::DelegateOnChannelRedirect() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::DelegateOnChannelRedirect() "
"sink=%p expectedCBs=%u mResult=%" "x", sink, mExpectedCallbacks
, static_cast<uint32_t>(mResult)); } } while (0)
142 "sink=%p expectedCBs=%u mResult=%" PRIx32,do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::DelegateOnChannelRedirect() "
"sink=%p expectedCBs=%u mResult=%" "x", sink, mExpectedCallbacks
, static_cast<uint32_t>(mResult)); } } while (0)
143 sink, mExpectedCallbacks, static_cast<uint32_t>(mResult)))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::DelegateOnChannelRedirect() "
"sink=%p expectedCBs=%u mResult=%" "x", sink, mExpectedCallbacks
, static_cast<uint32_t>(mResult)); } } while (0)
;
144
145 ++mExpectedCallbacks;
146
147 if (IsOldChannelCanceled()) {
148 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, " old channel has been canceled, cancel the redirect by "
"emulating OnRedirectVerifyCallback..."); } } while (0)
149 (" old channel has been canceled, cancel the redirect by "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, " old channel has been canceled, cancel the redirect by "
"emulating OnRedirectVerifyCallback..."); } } while (0)
150 "emulating OnRedirectVerifyCallback..."))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, " old channel has been canceled, cancel the redirect by "
"emulating OnRedirectVerifyCallback..."); } } while (0)
;
151 (void)OnRedirectVerifyCallback(NS_BINDING_ABORTED);
152 return NS_BINDING_ABORTED;
153 }
154
155 nsresult rv =
156 sink->AsyncOnChannelRedirect(oldChannel, newChannel, flags, this);
157
158 LOG((" result=%" PRIx32 " expectedCBs=%u", static_cast<uint32_t>(rv),do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, " result=%" "x" " expectedCBs=%u", static_cast
<uint32_t>(rv), mExpectedCallbacks); } } while (0)
159 mExpectedCallbacks))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, " result=%" "x" " expectedCBs=%u", static_cast
<uint32_t>(rv), mExpectedCallbacks); } } while (0)
;
160
161 // If the sink returns failure from this call the redirect is vetoed. We
162 // emulate a callback from the sink in this case in order to perform all
163 // the necessary logic.
164 if (NS_FAILED(rv)((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
165 LOG((" emulating OnRedirectVerifyCallback..."))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, " emulating OnRedirectVerifyCallback...")
; } } while (0)
;
166 (void)OnRedirectVerifyCallback(rv);
167 }
168
169 return rv; // Return the actual status since our caller may need it
170}
171
172void nsAsyncRedirectVerifyHelper::ExplicitCallback(nsresult result) {
173 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"result=%" "x" " expectedCBs=%u mCallbackInitiated=%u mResult=%"
"x", static_cast<uint32_t>(result), mExpectedCallbacks
, mCallbackInitiated, static_cast<uint32_t>(mResult)); }
} while (0)
174 ("nsAsyncRedirectVerifyHelper::ExplicitCallback() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"result=%" "x" " expectedCBs=%u mCallbackInitiated=%u mResult=%"
"x", static_cast<uint32_t>(result), mExpectedCallbacks
, mCallbackInitiated, static_cast<uint32_t>(mResult)); }
} while (0)
175 "result=%" PRIx32do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"result=%" "x" " expectedCBs=%u mCallbackInitiated=%u mResult=%"
"x", static_cast<uint32_t>(result), mExpectedCallbacks
, mCallbackInitiated, static_cast<uint32_t>(mResult)); }
} while (0)
176 " expectedCBs=%u mCallbackInitiated=%u mResult=%" PRIx32,do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"result=%" "x" " expectedCBs=%u mCallbackInitiated=%u mResult=%"
"x", static_cast<uint32_t>(result), mExpectedCallbacks
, mCallbackInitiated, static_cast<uint32_t>(mResult)); }
} while (0)
177 static_cast<uint32_t>(result), mExpectedCallbacks, mCallbackInitiated,do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"result=%" "x" " expectedCBs=%u mCallbackInitiated=%u mResult=%"
"x", static_cast<uint32_t>(result), mExpectedCallbacks
, mCallbackInitiated, static_cast<uint32_t>(mResult)); }
} while (0)
178 static_cast<uint32_t>(mResult)))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"result=%" "x" " expectedCBs=%u mCallbackInitiated=%u mResult=%"
"x", static_cast<uint32_t>(result), mExpectedCallbacks
, mCallbackInitiated, static_cast<uint32_t>(mResult)); }
} while (0)
;
179
180 nsCOMPtr<nsIAsyncVerifyRedirectCallback> callback(
181 do_QueryInterface(mOldChan));
182
183 if (!callback || !mCallbackEventTarget) {
184 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"callback=%p mCallbackEventTarget=%p", callback.get(), mCallbackEventTarget
.get()); } } while (0)
185 ("nsAsyncRedirectVerifyHelper::ExplicitCallback() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"callback=%p mCallbackEventTarget=%p", callback.get(), mCallbackEventTarget
.get()); } } while (0)
186 "callback=%p mCallbackEventTarget=%p",do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"callback=%p mCallbackEventTarget=%p", callback.get(), mCallbackEventTarget
.get()); } } while (0)
187 callback.get(), mCallbackEventTarget.get()))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"callback=%p mCallbackEventTarget=%p", callback.get(), mCallbackEventTarget
.get()); } } while (0)
;
188 return;
189 }
190
191 mCallbackInitiated = false; // reset to ensure only one callback
192 mWaitingForRedirectCallback = false;
193
194 // Now, dispatch the callback on the event-target which called Init()
195 nsCOMPtr<nsIRunnable> event =
196 new nsAsyncVerifyRedirectCallbackEvent(callback, result);
197 if (!event) {
198 NS_WARNING(NS_DebugBreak(NS_DEBUG_WARNING, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"failed creating callback event!", nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 200)
199 "nsAsyncRedirectVerifyHelper::ExplicitCallback() "NS_DebugBreak(NS_DEBUG_WARNING, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"failed creating callback event!", nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 200)
200 "failed creating callback event!")NS_DebugBreak(NS_DEBUG_WARNING, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"failed creating callback event!", nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 200)
;
201 return;
202 }
203 nsresult rv = mCallbackEventTarget->Dispatch(event, NS_DISPATCH_NORMALnsIEventTarget::DISPATCH_NORMAL);
204 if (NS_FAILED(rv)((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
205 NS_WARNING(NS_DebugBreak(NS_DEBUG_WARNING, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"failed dispatching callback event!", nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 207)
206 "nsAsyncRedirectVerifyHelper::ExplicitCallback() "NS_DebugBreak(NS_DEBUG_WARNING, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"failed dispatching callback event!", nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 207)
207 "failed dispatching callback event!")NS_DebugBreak(NS_DEBUG_WARNING, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"failed dispatching callback event!", nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 207)
;
208 } else {
209 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"dispatched callback event=%p", event.get()); } } while (0)
210 ("nsAsyncRedirectVerifyHelper::ExplicitCallback() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"dispatched callback event=%p", event.get()); } } while (0)
211 "dispatched callback event=%p",do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"dispatched callback event=%p", event.get()); } } while (0)
212 event.get()))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::ExplicitCallback() "
"dispatched callback event=%p", event.get()); } } while (0)
;
213 }
214}
215
216void nsAsyncRedirectVerifyHelper::InitCallback() {
217 LOG(do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::InitCallback() "
"expectedCBs=%d mResult=%" "x", mExpectedCallbacks, static_cast
<uint32_t>(mResult)); } } while (0)
218 ("nsAsyncRedirectVerifyHelper::InitCallback() "do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::InitCallback() "
"expectedCBs=%d mResult=%" "x", mExpectedCallbacks, static_cast
<uint32_t>(mResult)); } } while (0)
219 "expectedCBs=%d mResult=%" PRIx32,do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::InitCallback() "
"expectedCBs=%d mResult=%" "x", mExpectedCallbacks, static_cast
<uint32_t>(mResult)); } } while (0)
220 mExpectedCallbacks, static_cast<uint32_t>(mResult)))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::InitCallback() "
"expectedCBs=%d mResult=%" "x", mExpectedCallbacks, static_cast
<uint32_t>(mResult)); } } while (0)
;
221
222 mCallbackInitiated = true;
223
224 // Invoke the callback if we are done
225 if (mExpectedCallbacks == 0) ExplicitCallback(mResult);
226}
227
228NS_IMETHODIMPnsresult
229nsAsyncRedirectVerifyHelper::GetName(nsACString& aName) {
230 aName.AssignLiteral("nsAsyncRedirectVerifyHelper");
231 return NS_OK;
232}
233
234NS_IMETHODIMPnsresult
235nsAsyncRedirectVerifyHelper::Run() {
236 /* If the channel got canceled after it fired AsyncOnChannelRedirect
237 * and before we got here, mostly because docloader load has been canceled,
238 * we must completely ignore this notification and prevent any further
239 * notification.
240 */
241 if (IsOldChannelCanceled()) {
242 ExplicitCallback(NS_BINDING_ABORTED);
243 return NS_OK;
244 }
245
246 // If transparent, avoid notifying the observers.
247 if (mFlags & nsIChannelEventSink::REDIRECT_TRANSPARENT) {
248 ExplicitCallback(NS_OK);
249 return NS_OK;
250 }
251
252 // First, the global observer
253 NS_ASSERTION(gIOService, "Must have an IO service at this point")do { if (!(gIOService)) { NS_DebugBreak(NS_DEBUG_ASSERTION, "Must have an IO service at this point"
, "gIOService", "/var/lib/jenkins/workspace/firefox-scan-build/netwerk/base/nsAsyncRedirectVerifyHelper.cpp"
, 253); MOZ_PretendNoReturn(); } } while (0)
;
254 LOG(("nsAsyncRedirectVerifyHelper::Run() calling gIOService..."))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::Run() calling gIOService..."
); } } while (0)
;
255 nsresult rv =
256 gIOService->AsyncOnChannelRedirect(mOldChan, mNewChan, mFlags, this);
257 if (NS_FAILED(rv)((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) {
258 ExplicitCallback(rv);
259 return NS_OK;
260 }
261
262 // Now, the per-channel observers
263 nsCOMPtr<nsIChannelEventSink> sink;
264 NS_QueryNotificationCallbacks(mOldChan, sink);
265 if (sink) {
266 LOG(("nsAsyncRedirectVerifyHelper::Run() calling sink..."))do { const ::mozilla::LogModule* moz_real_module = gRedirectLog
; if ((__builtin_expect(!!(mozilla::detail::log_test(moz_real_module
, LogLevel::Debug)), 0))) { mozilla::detail::log_print(moz_real_module
, LogLevel::Debug, "nsAsyncRedirectVerifyHelper::Run() calling sink..."
); } } while (0)
;
267 rv = DelegateOnChannelRedirect(sink, mOldChan, mNewChan, mFlags);
Value stored to 'rv' is never read
268 }
269
270 // All invocations to AsyncOnChannelRedirect has been done - call
271 // InitCallback() to flag this
272 InitCallback();
273 return NS_OK;
274}
275
276bool nsAsyncRedirectVerifyHelper::IsOldChannelCanceled() {
277 if (!mOldChan) {
278 return false;
279 }
280 bool canceled;
281 nsresult rv = mOldChan->GetCanceled(&canceled);
282 return NS_SUCCEEDED(rv)((bool)(__builtin_expect(!!(!NS_FAILED_impl(rv)), 1))) && canceled;
283}
284
285} // namespace net
286} // namespace mozilla