From: Sean Hefty Date: Fri, 25 May 2012 19:42:12 +0000 (-0700) Subject: rs-preload: Handle recursive socket() calls X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=22c8a9c659c882aa6820f8c1484e530b88428e36;p=~shefty%2Flibrdmacm.git rs-preload: Handle recursive socket() calls When ACM support is enabled in the librdmacm, it will attempt to establish a socket connection to the ACM daemon. When the rsocket preload library is in use, this can result in a recursive call to socket() that results in the library hanging. The resulting call stack is: socket() -> rsocket() -> rdma_create_id() -> ucma_init() -> socket() -> rsocket() -> rdma_create_id() -> ucma_init() The second call to ucma_init() hangs because initialization is still pending. Fix this by checking for recursive calls to socket() in the preload library. When detected, call the real socket() call instead of directing the call back into rsockets(). Since rsockets is a part of the librdmacm, it can call rsockets directly if it wants to use rsockets instead of standard sockets. This problem and the cause was reported by Chet Murthy Signed-off-by: Sean Hefty --- diff --git a/src/preload.c b/src/preload.c index a3ef4883..d21389f3 100644 --- a/src/preload.c +++ b/src/preload.c @@ -325,22 +325,28 @@ void set_rsocket_options(int rsocket) int socket(int domain, int type, int protocol) { + static __thread int recursive; int index, ret; + if (recursive) + goto real; + init_preload(); index = fd_open(); if (index < 0) return index; + recursive = 1; ret = rsocket(domain, type, protocol); + recursive = 0; if (ret >= 0) { fd_store(index, ret, fd_rsocket); set_rsocket_options(ret); return index; - } else { - fd_close(index, &ret); - return real_socket(domain, type, protocol); } + fd_close(index, &ret); +real: + return real_socket(domain, type, protocol); } int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)