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..c8ebe94e5d875061c4da3aa4060560736b5db11b 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,15 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
switch (name) { |
case PP_UDPSOCKET_OPTION_ADDRESS_REUSE: |
case PP_UDPSOCKET_OPTION_BROADCAST: { |
- if (bound_) |
+ if ((check_bind_state || name == PP_UDPSOCKET_OPTION_ADDRESS_REUSE) && |
+ bind_called_) { |
+ // We reject SetOption here, regardless of inflight Bind() is (will be) |
+ // successfully done or not. This is for providing stable behavior |
+ // of the SetOption() during Bind()ing. Note that |bind_called_| |
+ // should be used, instead of |bound_|. |bound_| is set true on |
+ // successful Bind() call, so it's too late. |
bbudge
2014/12/11 02:49:06
OK, I think I understand the issue. How about some
hidehiko
2014/12/11 05:02:33
Done.
|
return PP_ERROR_FAILED; |
+ } |
if (value.type != PP_VARTYPE_BOOL) |
return PP_ERROR_BADARGUMENT; |
option_data.SetBool(PP_ToBool(value.value.as_bool)); |
@@ -78,7 +87,7 @@ int32_t UDPSocketResourceBase::SetOptionImpl( |
} |
case PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE: |
case PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE: { |
- if (!bound_) |
+ if (check_bind_state && !bound_) |
return PP_ERROR_FAILED; |
if (value.type != PP_VARTYPE_INT32) |
return PP_ERROR_BADARGUMENT; |
@@ -111,6 +120,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. |