Chromium Code Reviews| 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. |