projects
/
m6w6
/
libmemcached
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
This fixes lp:1010899, which showed a condition where we could end up with a bad...
[m6w6/libmemcached]
/
libmemcached
/
connect.cc
diff --git
a/libmemcached/connect.cc
b/libmemcached/connect.cc
index 34e72f76b34231f520b8c170933a9df57f44adf2..a8a2c5a4631126cef98200eacfe263a7ab680579 100644
(file)
--- a/
libmemcached/connect.cc
+++ b/
libmemcached/connect.cc
@@
-42,7
+42,11
@@
#include <ctime>
#include <sys/time.h>
#include <ctime>
#include <sys/time.h>
-static memcached_return_t connect_poll(memcached_server_st *server)
+#ifndef SOCK_CLOEXEC
+#define SOCK_CLOEXEC 0
+#endif
+
+static memcached_return_t connect_poll(memcached_instance_st *server)
{
struct pollfd fds[1];
fds[0].fd= server->fd;
{
struct pollfd fds[1];
fds[0].fd= server->fd;
@@
-135,7
+139,7
@@
static memcached_return_t connect_poll(memcached_server_st *server)
return memcached_set_errno(*server, get_socket_errno(), MEMCACHED_AT);
}
return memcached_set_errno(*server, get_socket_errno(), MEMCACHED_AT);
}
-static memcached_return_t set_hostinfo(memcached_
server
_st *server)
+static memcached_return_t set_hostinfo(memcached_
instance
_st *server)
{
assert(server->type != MEMCACHED_CONNECTION_UNIX_SOCKET);
if (server->address_info)
{
assert(server->type != MEMCACHED_CONNECTION_UNIX_SOCKET);
if (server->address_info)
@@
-199,7
+203,7
@@
static memcached_return_t set_hostinfo(memcached_server_st *server)
return MEMCACHED_SUCCESS;
}
return MEMCACHED_SUCCESS;
}
-static inline void set_socket_nonblocking(memcached_
server
_st *server)
+static inline void set_socket_nonblocking(memcached_
instance
_st *server)
{
#ifdef WIN32
u_long arg= 1;
{
#ifdef WIN32
u_long arg= 1;
@@
-236,7
+240,7
@@
static inline void set_socket_nonblocking(memcached_server_st *server)
#endif
}
#endif
}
-static void set_socket_options(memcached_
server
_st *server)
+static void set_socket_options(memcached_
instance
_st *server)
{
assert_msg(server->fd != INVALID_SOCKET, "invalid socket was passed to set_socket_options()");
{
assert_msg(server->fd != INVALID_SOCKET, "invalid socket was passed to set_socket_options()");
@@
-345,7
+349,7
@@
static void set_socket_options(memcached_server_st *server)
set_socket_nonblocking(server);
}
set_socket_nonblocking(server);
}
-static memcached_return_t unix_socket_connect(memcached_
server
_st *server)
+static memcached_return_t unix_socket_connect(memcached_
instance
_st *server)
{
#ifndef WIN32
WATCHPOINT_ASSERT(server->fd == INVALID_SOCKET);
{
#ifndef WIN32
WATCHPOINT_ASSERT(server->fd == INVALID_SOCKET);
@@
-396,7
+400,7
@@
static memcached_return_t unix_socket_connect(memcached_server_st *server)
#endif
}
#endif
}
-static memcached_return_t network_connect(memcached_
server
_st *server)
+static memcached_return_t network_connect(memcached_
instance
_st *server)
{
bool timeout_error_occured= false;
{
bool timeout_error_occured= false;
@@
-451,13
+455,30
@@
static memcached_return_t network_connect(memcached_server_st *server)
continue;
}
continue;
}
+ int type= server->address_info_next->ai_socktype;
+ if (HAVE_SOCK_CLOEXEC)
+ {
+ type|= SOCK_CLOEXEC;
+ }
+
if ((server->fd= socket(server->address_info_next->ai_family,
if ((server->fd= socket(server->address_info_next->ai_family,
-
server->address_info_next->ai_sock
type,
+ type,
server->address_info_next->ai_protocol)) < 0)
{
return memcached_set_errno(*server, get_socket_errno(), NULL);
}
server->address_info_next->ai_protocol)) < 0)
{
return memcached_set_errno(*server, get_socket_errno(), NULL);
}
+ if (HAVE_SOCK_CLOEXEC == 0)
+ {
+#ifdef FD_CLOEXEC
+ int rval;
+ do
+ {
+ rval= fcntl (server->fd, F_SETFD, FD_CLOEXEC);
+ } while (rval == -1 && (errno == EINTR or errno == EAGAIN));
+#endif
+ }
+
set_socket_options(server);
/* connect to server */
set_socket_options(server);
/* connect to server */
@@
-533,7
+554,7
@@
static memcached_return_t network_connect(memcached_server_st *server)
if (memcached_has_current_error(*server))
{
if (memcached_has_current_error(*server))
{
- return memcached_
server
_error_return(server);
+ return memcached_
instance
_error_return(server);
}
if (timeout_error_occured and server->state < MEMCACHED_SERVER_STATE_IN_PROGRESS)
}
if (timeout_error_occured and server->state < MEMCACHED_SERVER_STATE_IN_PROGRESS)
@@
-683,7
+704,7
@@
static memcached_return_t _memcached_connect(memcached_server_write_instance_st
if (memcached_has_current_error(*server))
{
memcached_mark_server_for_timeout(server);
if (memcached_has_current_error(*server))
{
memcached_mark_server_for_timeout(server);
- assert(memcached_failed(memcached_
server
_error_return(server)));
+ assert(memcached_failed(memcached_
instance
_error_return(server)));
}
else
{
}
else
{