Commit f90e67e8 authored by hubbe's avatar hubbe Committed by Commit bot

Cast: Fix crash in udp_transport

When connecting to a port on localhost which is not yet open, connect fails and udp_socket crashes when trying to send packets. This fixes that.

Review URL: https://codereview.chromium.org/967723002

Cr-Commit-Position: refs/heads/master@{#330442}
parent fb3f20a2
......@@ -66,6 +66,11 @@ void UdpTransport::StartReceiving(
const PacketReceiverCallbackWithStatus& packet_receiver) {
DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
if (!udp_socket_) {
status_callback_.Run(TRANSPORT_SOCKET_ERROR);
return;
}
packet_receiver_ = packet_receiver;
udp_socket_->SetMulticastLoopbackMode(true);
if (!IsEmpty(local_addr_)) {
......@@ -73,6 +78,7 @@ void UdpTransport::StartReceiving(
udp_socket_->AllowAddressReuse() < 0 ||
udp_socket_->Bind(local_addr_) < 0) {
udp_socket_->Close();
udp_socket_.reset();
status_callback_.Run(TRANSPORT_SOCKET_ERROR);
LOG(ERROR) << "Failed to bind local address.";
return;
......@@ -82,6 +88,7 @@ void UdpTransport::StartReceiving(
udp_socket_->AllowAddressReuse() < 0 ||
udp_socket_->Connect(remote_addr_) < 0) {
udp_socket_->Close();
udp_socket_.reset();
status_callback_.Run(TRANSPORT_SOCKET_ERROR);
LOG(ERROR) << "Failed to connect to remote address.";
return;
......@@ -111,6 +118,8 @@ void UdpTransport::SetDscp(net::DiffServCodePoint dscp) {
#if defined(OS_WIN)
void UdpTransport::UseNonBlockingIO() {
DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
if (!udp_socket_)
return;
udp_socket_->UseNonBlockingIO();
}
#endif
......@@ -131,6 +140,8 @@ void UdpTransport::ReceiveNextPacket(int length_or_status) {
if (packet_receiver_.is_null())
return;
if (!udp_socket_)
return;
// Loop while UdpSocket is delivering data synchronously. When it responds
// with a "pending" status, break and expect this method to be called back in
......@@ -187,6 +198,8 @@ void UdpTransport::ReceiveNextPacket(int length_or_status) {
bool UdpTransport::SendPacket(PacketRef packet, const base::Closure& cb) {
DCHECK(io_thread_proxy_->RunsTasksOnCurrentThread());
if (!udp_socket_)
return true;
// Increase byte count no matter the packet was sent or dropped.
bytes_sent_ += packet->data.size();
......
......@@ -80,7 +80,7 @@ class UdpTransport : public PacketSender {
const scoped_refptr<base::SingleThreadTaskRunner> io_thread_proxy_;
const net::IPEndPoint local_addr_;
net::IPEndPoint remote_addr_;
const scoped_ptr<net::UDPSocket> udp_socket_;
scoped_ptr<net::UDPSocket> udp_socket_;
bool send_pending_;
bool receive_pending_;
bool client_connected_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment