33 lines
1.2 KiB
Diff
33 lines
1.2 KiB
Diff
From 7a6651a31038cb19807524d0422e09271c5ffec9 Mon Sep 17 00:00:00 2001
|
|
From: Attila Kovacs <attila.kovacs@cfa.harvard.edu>
|
|
Date: Tue, 26 Jul 2022 15:20:05 -0400
|
|
Subject: [PATCH] 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>
|
|
---
|
|
src/clnt_dg.c | 1 -
|
|
1 file changed, 1 deletion(-)
|
|
|
|
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);
|
|
--
|
|
1.8.3.1
|