From: Sean Hefty Date: Sat, 26 May 2012 00:24:08 +0000 (-0700) Subject: rsocket: Fix hang in rrecv() after disconnecting X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=f2eaacf21e6e8ae686e06706cfa65a2846235872;p=~shefty%2Flibrdmacm.git rsocket: Fix hang in rrecv() after disconnecting If a user calls rrecv() after a blocking rsocket has been disconnected, it will hang. This problem was reported by Sirdhar Samudrala . It can be reproduced by running netserver -f -D using the rs-preload library. Signed-off-by: Pradeep Satyanarayana Signed-off-by: Sean Hefty --- diff --git a/src/rsocket.c b/src/rsocket.c index 5eec5d9c..dc6fc708 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -121,6 +121,9 @@ struct rs_conn_data { struct rs_sge data_buf; }; +/* + * rsocket states are ordered as connecting, connected, disconnected. + */ enum rs_state { rs_init, rs_bound, @@ -994,9 +997,7 @@ ssize_t rrecv(int socket, void *buf, size_t len, int flags) int ret; rs = idm_at(&idm, socket); - if (rs->state != rs_connected && - (rs->state == rs_resolving_addr || rs->state == rs_resolving_route || - rs->state == rs_connecting || rs->state == rs_accepting)) { + if (rs->state < rs_connected) { ret = rs_do_connect(rs); if (ret) { if (errno == EINPROGRESS) @@ -1098,7 +1099,7 @@ ssize_t rsend(int socket, const void *buf, size_t len, int flags) int ret = 0; rs = idm_at(&idm, socket); - if (rs->state != rs_connected) { + if (rs->state < rs_connected) { ret = rs_do_connect(rs); if (ret) { if (errno == EINPROGRESS)