Bug 1359106 - Make sure AltDataOutputStreamParent::SendError is not called after ActorDestroy r=bagder
MozReview-Commit-ID: I2m4K7MhQoA
--- a/netwerk/protocol/http/AltDataOutputStreamParent.cpp
+++ b/netwerk/protocol/http/AltDataOutputStreamParent.cpp
@@ -11,61 +11,67 @@
namespace mozilla {
namespace net {
NS_IMPL_ISUPPORTS0(AltDataOutputStreamParent)
AltDataOutputStreamParent::AltDataOutputStreamParent(nsIOutputStream* aStream)
: mOutputStream(aStream)
, mStatus(NS_OK)
+ , mIPCOpen(true)
{
MOZ_ASSERT(NS_IsMainThread(), "Main thread only");
}
AltDataOutputStreamParent::~AltDataOutputStreamParent()
{
MOZ_ASSERT(NS_IsMainThread(), "Main thread only");
}
mozilla::ipc::IPCResult
AltDataOutputStreamParent::RecvWriteData(const nsCString& data)
{
if (NS_FAILED(mStatus)) {
- Unused << SendError(mStatus);
+ if (mIPCOpen) {
+ Unused << SendError(mStatus);
+ }
return IPC_OK();
}
nsresult rv;
uint32_t n;
if (mOutputStream) {
rv = mOutputStream->Write(data.BeginReading(), data.Length(), &n);
MOZ_ASSERT(n == data.Length());
- if (NS_FAILED(rv)) {
+ if (NS_FAILED(rv) && mIPCOpen) {
Unused << SendError(rv);
}
}
return IPC_OK();
}
mozilla::ipc::IPCResult
AltDataOutputStreamParent::RecvClose()
{
if (NS_FAILED(mStatus)) {
- Unused << SendError(mStatus);
+ if (mIPCOpen) {
+ Unused << SendError(mStatus);
+ }
return IPC_OK();
}
nsresult rv;
if (mOutputStream) {
rv = mOutputStream->Close();
- if (NS_FAILED(rv)) {
+ if (NS_FAILED(rv) && mIPCOpen) {
Unused << SendError(rv);
}
mOutputStream = nullptr;
}
return IPC_OK();
}
void
AltDataOutputStreamParent::ActorDestroy(ActorDestroyReason aWhy)
{
+ mIPCOpen = false;
}
} // namespace net
} // namespace mozilla
--- a/netwerk/protocol/http/AltDataOutputStreamParent.h
+++ b/netwerk/protocol/http/AltDataOutputStreamParent.h
@@ -39,14 +39,15 @@ public:
void SetError(nsresult status) { mStatus = status; }
private:
virtual ~AltDataOutputStreamParent();
nsCOMPtr<nsIOutputStream> mOutputStream;
// In case any error occurs mStatus will be != NS_OK, and this status code will
// be sent to the content process asynchronously.
nsresult mStatus;
+ bool mIPCOpen;
};
} // namespace net
} // namespace mozilla
#endif // mozilla_net_AltDataOutputStreamParent_h