|
|
ced1f5 |
From 63c09393b926f0d00317a1ca1dc6c7c992c40f4e Mon Sep 17 00:00:00 2001
|
|
|
ced1f5 |
From: Sumit Bose <sbose@redhat.com>
|
|
|
ced1f5 |
Date: Tue, 16 Jan 2018 18:09:00 +0100
|
|
|
ced1f5 |
Subject: [PATCH 96/96] nss-idmap: check timed muted return code
|
|
|
ced1f5 |
|
|
|
ced1f5 |
Check return values and make sure the mutex is released in case of
|
|
|
ced1f5 |
errors.
|
|
|
ced1f5 |
|
|
|
ced1f5 |
Related to https://pagure.io/SSSD/sssd/issue/2478
|
|
|
ced1f5 |
|
|
|
ced1f5 |
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
|
|
|
ced1f5 |
(cherry picked from commit 3e32cb2ad36a9dd2654c7f63469dc595f1bb8593)
|
|
|
ced1f5 |
---
|
|
|
ced1f5 |
src/sss_client/idmap/common_ex.c | 2 ++
|
|
|
ced1f5 |
src/sss_client/idmap/sss_nss_ex.c | 5 ++++-
|
|
|
ced1f5 |
src/sss_client/idmap/sss_nss_idmap.c | 5 ++++-
|
|
|
ced1f5 |
3 files changed, 10 insertions(+), 2 deletions(-)
|
|
|
ced1f5 |
|
|
|
ced1f5 |
diff --git a/src/sss_client/idmap/common_ex.c b/src/sss_client/idmap/common_ex.c
|
|
|
ced1f5 |
index 5efe9fabed7896ce674615472dbb256c4eae2144..e655bb864e063665cb56bcd3ff419e46c766478b 100644
|
|
|
ced1f5 |
--- a/src/sss_client/idmap/common_ex.c
|
|
|
ced1f5 |
+++ b/src/sss_client/idmap/common_ex.c
|
|
|
ced1f5 |
@@ -83,6 +83,7 @@ int sss_nss_timedlock(unsigned int timeout_ms, int *time_left_ms)
|
|
|
ced1f5 |
if (ret == 0) {
|
|
|
ced1f5 |
ret = clock_gettime(CLOCK_REALTIME, &endtime);
|
|
|
ced1f5 |
if (ret != 0) {
|
|
|
ced1f5 |
+ sss_nss_unlock();
|
|
|
ced1f5 |
return ret;
|
|
|
ced1f5 |
}
|
|
|
ced1f5 |
|
|
|
ced1f5 |
@@ -92,6 +93,7 @@ int sss_nss_timedlock(unsigned int timeout_ms, int *time_left_ms)
|
|
|
ced1f5 |
TIMESPECSUB(&endtime, &starttime, &diff);
|
|
|
ced1f5 |
left = timeout_ms - TIMESPEC_TO_MS(&diff);
|
|
|
ced1f5 |
if (left <= 0) {
|
|
|
ced1f5 |
+ sss_nss_unlock();
|
|
|
ced1f5 |
return EIO;
|
|
|
ced1f5 |
} else if (left > SSS_CLI_SOCKET_TIMEOUT) {
|
|
|
ced1f5 |
*time_left_ms = SSS_CLI_SOCKET_TIMEOUT;
|
|
|
ced1f5 |
diff --git a/src/sss_client/idmap/sss_nss_ex.c b/src/sss_client/idmap/sss_nss_ex.c
|
|
|
ced1f5 |
index 861b1e1e92db4f7e6e8d74a812dc3c9220711773..af6a95180656b598bcb94c209dfa821cb0275f02 100644
|
|
|
ced1f5 |
--- a/src/sss_client/idmap/sss_nss_ex.c
|
|
|
ced1f5 |
+++ b/src/sss_client/idmap/sss_nss_ex.c
|
|
|
ced1f5 |
@@ -202,7 +202,10 @@ int sss_get_ex(struct nss_input *inp, uint32_t flags, unsigned int timeout)
|
|
|
ced1f5 |
}
|
|
|
ced1f5 |
}
|
|
|
ced1f5 |
|
|
|
ced1f5 |
- sss_nss_timedlock(timeout, &time_left);
|
|
|
ced1f5 |
+ ret = sss_nss_timedlock(timeout, &time_left);
|
|
|
ced1f5 |
+ if (ret != 0) {
|
|
|
ced1f5 |
+ return ret;
|
|
|
ced1f5 |
+ }
|
|
|
ced1f5 |
|
|
|
ced1f5 |
if (!skip_mc && !skip_data) {
|
|
|
ced1f5 |
/* previous thread might already initialize entry in mmap cache */
|
|
|
ced1f5 |
diff --git a/src/sss_client/idmap/sss_nss_idmap.c b/src/sss_client/idmap/sss_nss_idmap.c
|
|
|
ced1f5 |
index 6e7685d2b1d80956b6a6668e9bbb146abd9e86ed..cbf8c11f2870e3574c75fe109cb19268e8a0b56d 100644
|
|
|
ced1f5 |
--- a/src/sss_client/idmap/sss_nss_idmap.c
|
|
|
ced1f5 |
+++ b/src/sss_client/idmap/sss_nss_idmap.c
|
|
|
ced1f5 |
@@ -257,7 +257,10 @@ static int sss_nss_getyyybyxxx(union input inp, enum sss_cli_command cmd,
|
|
|
ced1f5 |
if (timeout == NO_TIMEOUT) {
|
|
|
ced1f5 |
sss_nss_lock();
|
|
|
ced1f5 |
} else {
|
|
|
ced1f5 |
- sss_nss_timedlock(timeout, &time_left);
|
|
|
ced1f5 |
+ ret = sss_nss_timedlock(timeout, &time_left);
|
|
|
ced1f5 |
+ if (ret != 0) {
|
|
|
ced1f5 |
+ return ret;
|
|
|
ced1f5 |
+ }
|
|
|
ced1f5 |
}
|
|
|
ced1f5 |
|
|
|
ced1f5 |
nret = sss_nss_make_request_timeout(cmd, &rd, time_left, &repbuf, &replen,
|
|
|
ced1f5 |
--
|
|
|
ced1f5 |
2.14.3
|
|
|
ced1f5 |
|