diff options
author | Attila Kovacs <attila.kovacs@cfa.harvard.edu> | 2022-07-26 15:20:05 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2022-07-26 15:26:39 -0400 |
commit | 7a6651a31038cb19807524d0422e09271c5ffec9 (patch) | |
tree | e3fa60442ad82919401b9d65585cf25ee7b4e658 /src | |
parent | 21718bbbfa2a4bf4992bd295e25cbc67868dcfc1 (diff) | |
download | ti-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.c | 1 |
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); |