Index: ppapi/proxy/udp_socket_resource_base.cc |
diff --git a/ppapi/proxy/udp_socket_resource_base.cc b/ppapi/proxy/udp_socket_resource_base.cc |
index 521a6e2f4e284220d649e8d49934f503b6245127..6f9b5c8cf291d32e60ebf86234c24a3f3ea279ec 100644 |
--- a/ppapi/proxy/udp_socket_resource_base.cc |
+++ b/ppapi/proxy/udp_socket_resource_base.cc |
@@ -34,6 +34,7 @@ UDPSocketResourceBase::UDPSocketResourceBase(Connection connection, |
bool private_api) |
: PluginResource(connection, instance), |
private_api_(private_api), |
+ bind_called_(false), |
bound_(false), |
closed_(false), |
read_buffer_(NULL), |
@@ -61,6 +62,7 @@ UDPSocketResourceBase::~UDPSocketResourceBase() { |
int32_t UDPSocketResourceBase::SetOptionImpl( |
PP_UDPSocket_Option name, |
const PP_Var& value, |
+ bool check_bind_state, |
scoped_refptr<TrackedCallback> callback) { |
if (closed_) |
return PP_ERROR_FAILED; |
@@ -69,8 +71,11 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
switch (name) { |
case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
case PP_UDPSOCKET_OPTION_BROADCAST: { |
- if (bound_) |
+ // On version 1.0 or earlier (private), these option can be set only |
+ // before calling Bind(). |
+ if (check_bind_state && bind_called_) |
return PP_ERROR_FAILED; |
+ |
if (value.type != PP_VARTYPE_BOOL) |
return PP_ERROR_BADARGUMENT; |
option_data.SetBool(PP_ToBool(value.value.as_bool)); |
@@ -78,8 +83,11 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
} |
case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { |
- if (!bound_) |
+ // On version 1.0 or earlier (private), these option can be set only |
+ // after Bind() is successfully done. |
+ if (check_bind_state && !bound_) |
return PP_ERROR_FAILED; |
+ |
if (value.type != PP_VARTYPE_INT32) |
return PP_ERROR_BADARGUMENT; |
option_data.SetInt32(value.value.as_int); |
@@ -111,6 +119,7 @@ int32_t UDPSocketResourceBase::BindImpl( |
if (TrackedCallback::IsPending(bind_callback_)) |
return PP_ERROR_INPROGRESS; |
+ bind_called_ = true; |
bind_callback_ = callback; |
// Send the request, the browser will call us back via BindReply. |