summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAttila Kovacs <attila.kovacs@cfa.harvard.edu>2022-07-26 15:20:05 -0400
committerSteve Dickson <steved@redhat.com>2022-07-26 15:26:39 -0400
commit7a6651a31038cb19807524d0422e09271c5ffec9 (patch)
treee3fa60442ad82919401b9d65585cf25ee7b4e658 /src
parent21718bbbfa2a4bf4992bd295e25cbc67868dcfc1 (diff)
downloadti-rpc-7a6651a31038cb19807524d0422e09271c5ffec9.tar.gz
clnt_dg_freeres() uncleared set active state may deadlock.
In clnt_dg.c in clnt_dg_freeres(), cu_fd_lock->active is set to TRUE, with no corresponding clearing when the operation (*xdr_res() call) is completed. This would leave other waiting operations blocked indefinitely, effectively deadlocking the client. For comparison, clnt_vd_freeres() in clnt_vc.c does not set the active state to TRUE. I believe the vc behavior is correct, while the dg behavior is a bug. Signed-off-by: Attila Kovacs <attipaci@gmail.com> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/clnt_dg.c1
1 files changed, 0 insertions, 1 deletions
diff --git a/src/clnt_dg.c b/src/clnt_dg.c
index 7c5d22e..b2043ac 100644
--- a/src/clnt_dg.c
+++ b/src/clnt_dg.c
@@ -573,7 +573,6 @@ clnt_dg_freeres(cl, xdr_res, res_ptr)
mutex_lock(&clnt_fd_lock);
while (cu->cu_fd_lock->active)
cond_wait(&cu->cu_fd_lock->cv, &clnt_fd_lock);
- cu->cu_fd_lock->active = TRUE;
xdrs->x_op = XDR_FREE;
dummy = (*xdr_res)(xdrs, res_ptr);
thr_sigsetmask(SIG_SETMASK, &mask, NULL);