| Index: native_client_sdk/src/libraries/nacl_io/mount_node_udp.cc
|
| diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node_udp.cc b/native_client_sdk/src/libraries/nacl_io/mount_node_udp.cc
|
| index 3a98372241c91e2670948993273d85ff97aa6ca8..c35a8f5e4bf0fe7de9086fc677f82177fb165386 100644
|
| --- a/native_client_sdk/src/libraries/nacl_io/mount_node_udp.cc
|
| +++ b/native_client_sdk/src/libraries/nacl_io/mount_node_udp.cc
|
| @@ -218,10 +218,14 @@ Error MountNodeUDP::Bind(const struct sockaddr* addr, socklen_t len) {
|
| int err = UDPInterface()->Bind(socket_resource_,
|
| out_addr,
|
| PP_BlockUntilComplete());
|
| - if (err != 0) {
|
| - mount_->ppapi()->ReleaseResource(out_addr);
|
| + mount_->ppapi()->ReleaseResource(out_addr);
|
| + if (err != 0)
|
| return PPErrorToErrno(err);
|
| - }
|
| +
|
| + // Get the address that was actually bound (in case addr was 0.0.0.0:0).
|
| + out_addr = UDPInterface()->GetBoundAddress(socket_resource_);
|
| + if (out_addr == 0)
|
| + return EINVAL;
|
|
|
| // Now that we are bound, we can start sending and receiving.
|
| SetStreamFlags(SSF_CAN_SEND | SSF_CAN_RECV);
|
| @@ -282,6 +286,18 @@ Error MountNodeUDP::Send_Locked(const void* buf,
|
| size_t len,
|
| PP_Resource addr,
|
| int* out_len) {
|
| + if (!IsBound()) {
|
| + // Pepper requires a socket to be bound before it can send.
|
| + sockaddr_in addr;
|
| + addr.sin_family = AF_INET;
|
| + addr.sin_port = 0;
|
| + memset(&addr.sin_addr, 0, sizeof(addr.sin_addr));
|
| + Error err =
|
| + Bind(reinterpret_cast<const struct sockaddr*>(&addr), sizeof(addr));
|
| + if (err != 0)
|
| + return err;
|
| + }
|
| +
|
| *out_len = 0;
|
| int capped_len =
|
| static_cast<int32_t>(std::min<int>(len, kMaxPacketSize));
|
|
|