Blame SOURCES/0010-NSS-client-preserve-errno-during-_nss_sss_end-calls.patch

8aada9
From aac4dbb17f3e19a2fbeefb38b3319827d3bf820e Mon Sep 17 00:00:00 2001
8aada9
From: Sumit Bose <sbose@redhat.com>
8aada9
Date: Wed, 13 May 2020 13:13:43 +0200
8aada9
Subject: [PATCH] NSS client: preserve errno during _nss_sss_end* calls
8aada9
8aada9
glibc does not expect that errno is changed by some of the calls
8aada9
provided by nss modules. This caused at least issues when
8aada9
_nss_sss_endpwent() is called in compat mode. According to
8aada9
https://pubs.opengroup.org/onlinepubs/9699919799/functions/endpwent.html
8aada9
endpwent() should only set errno in the case of an error. Since there is
8aada9
no other way to report an error we will set errno in the case of an
8aada9
error but preserve it otherwise. This should cause no issues because
8aada9
glibc is taking precautions as well tracked by
8aada9
https://sourceware.org/bugzilla/show_bug.cgi?id=25976.
8aada9
8aada9
To be on the safe side the other _nss_sss_end* calls will show the same
8aada9
behavior.
8aada9
8aada9
Resolves: https://github.com/SSSD/sssd/issues/5153
8aada9
8aada9
Reviewed-by: Alexey Tikhonov <atikhonov@redhat.com>
8aada9
---
8aada9
 src/sss_client/nss_group.c      | 3 +++
8aada9
 src/sss_client/nss_hosts.c      | 4 +++-
8aada9
 src/sss_client/nss_ipnetworks.c | 4 +++-
8aada9
 src/sss_client/nss_netgroup.c   | 3 +++
8aada9
 src/sss_client/nss_passwd.c     | 3 +++
8aada9
 src/sss_client/nss_services.c   | 3 +++
8aada9
 6 files changed, 18 insertions(+), 2 deletions(-)
8aada9
8aada9
diff --git a/src/sss_client/nss_group.c b/src/sss_client/nss_group.c
8aada9
index 5ab2bdf78..4a201bf09 100644
8aada9
--- a/src/sss_client/nss_group.c
8aada9
+++ b/src/sss_client/nss_group.c
8aada9
@@ -735,6 +735,7 @@ enum nss_status _nss_sss_endgrent(void)
8aada9
 {
8aada9
     enum nss_status nret;
8aada9
     int errnop;
8aada9
+    int saved_errno = errno;
8aada9
 
8aada9
     sss_nss_lock();
8aada9
 
8aada9
@@ -745,6 +746,8 @@ enum nss_status _nss_sss_endgrent(void)
8aada9
                                 NULL, NULL, NULL, &errnop);
8aada9
     if (nret != NSS_STATUS_SUCCESS) {
8aada9
         errno = errnop;
8aada9
+    } else {
8aada9
+        errno = saved_errno;
8aada9
     }
8aada9
 
8aada9
     sss_nss_unlock();
8aada9
diff --git a/src/sss_client/nss_hosts.c b/src/sss_client/nss_hosts.c
8aada9
index 5e279468b..aa2676286 100644
8aada9
--- a/src/sss_client/nss_hosts.c
8aada9
+++ b/src/sss_client/nss_hosts.c
8aada9
@@ -565,6 +565,7 @@ _nss_sss_endhostent(void)
8aada9
 {
8aada9
     enum nss_status nret;
8aada9
     int errnop;
8aada9
+    int saved_errno = errno;
8aada9
 
8aada9
     sss_nss_lock();
8aada9
 
8aada9
@@ -575,9 +576,10 @@ _nss_sss_endhostent(void)
8aada9
                                 NULL, NULL, NULL, &errnop);
8aada9
     if (nret != NSS_STATUS_SUCCESS) {
8aada9
         errno = errnop;
8aada9
+    } else {
8aada9
+        errno = saved_errno;
8aada9
     }
8aada9
 
8aada9
     sss_nss_unlock();
8aada9
-
8aada9
     return nret;
8aada9
 }
8aada9
diff --git a/src/sss_client/nss_ipnetworks.c b/src/sss_client/nss_ipnetworks.c
8aada9
index 15fee6039..08070499d 100644
8aada9
--- a/src/sss_client/nss_ipnetworks.c
8aada9
+++ b/src/sss_client/nss_ipnetworks.c
8aada9
@@ -510,6 +510,7 @@ _nss_sss_endnetent(void)
8aada9
 {
8aada9
     enum nss_status nret;
8aada9
     int errnop;
8aada9
+    int saved_errno = errno;
8aada9
 
8aada9
     sss_nss_lock();
8aada9
 
8aada9
@@ -520,10 +521,11 @@ _nss_sss_endnetent(void)
8aada9
                                 NULL, NULL, NULL, &errnop);
8aada9
     if (nret != NSS_STATUS_SUCCESS) {
8aada9
         errno = errnop;
8aada9
+    } else {
8aada9
+        errno = saved_errno;
8aada9
     }
8aada9
 
8aada9
     sss_nss_unlock();
8aada9
-
8aada9
     return nret;
8aada9
 }
8aada9
 
8aada9
diff --git a/src/sss_client/nss_netgroup.c b/src/sss_client/nss_netgroup.c
8aada9
index 3a1834a31..2fc88f8ae 100644
8aada9
--- a/src/sss_client/nss_netgroup.c
8aada9
+++ b/src/sss_client/nss_netgroup.c
8aada9
@@ -309,6 +309,7 @@ enum nss_status _nss_sss_endnetgrent(struct __netgrent *result)
8aada9
 {
8aada9
     enum nss_status nret;
8aada9
     int errnop;
8aada9
+    int saved_errno = errno;
8aada9
 
8aada9
     sss_nss_lock();
8aada9
 
8aada9
@@ -319,6 +320,8 @@ enum nss_status _nss_sss_endnetgrent(struct __netgrent *result)
8aada9
                                 NULL, NULL, NULL, &errnop);
8aada9
     if (nret != NSS_STATUS_SUCCESS) {
8aada9
         errno = errnop;
8aada9
+    } else {
8aada9
+        errno = saved_errno;
8aada9
     }
8aada9
 
8aada9
     sss_nss_unlock();
8aada9
diff --git a/src/sss_client/nss_passwd.c b/src/sss_client/nss_passwd.c
8aada9
index 96368bd6e..c386dd370 100644
8aada9
--- a/src/sss_client/nss_passwd.c
8aada9
+++ b/src/sss_client/nss_passwd.c
8aada9
@@ -455,6 +455,7 @@ enum nss_status _nss_sss_endpwent(void)
8aada9
 {
8aada9
     enum nss_status nret;
8aada9
     int errnop;
8aada9
+    int saved_errno = errno;
8aada9
 
8aada9
     sss_nss_lock();
8aada9
 
8aada9
@@ -465,6 +466,8 @@ enum nss_status _nss_sss_endpwent(void)
8aada9
                                 NULL, NULL, NULL, &errnop);
8aada9
     if (nret != NSS_STATUS_SUCCESS) {
8aada9
         errno = errnop;
8aada9
+    } else {
8aada9
+        errno = saved_errno;
8aada9
     }
8aada9
 
8aada9
     sss_nss_unlock();
8aada9
diff --git a/src/sss_client/nss_services.c b/src/sss_client/nss_services.c
8aada9
index 13cb4c3ab..f8c2092cb 100644
8aada9
--- a/src/sss_client/nss_services.c
8aada9
+++ b/src/sss_client/nss_services.c
8aada9
@@ -484,6 +484,7 @@ _nss_sss_endservent(void)
8aada9
 {
8aada9
     enum nss_status nret;
8aada9
     int errnop;
8aada9
+    int saved_errno = errno;
8aada9
 
8aada9
     sss_nss_lock();
8aada9
 
8aada9
@@ -494,6 +495,8 @@ _nss_sss_endservent(void)
8aada9
                                 NULL, NULL, NULL, &errnop);
8aada9
     if (nret != NSS_STATUS_SUCCESS) {
8aada9
         errno = errnop;
8aada9
+    } else {
8aada9
+        errno = saved_errno;
8aada9
     }
8aada9
 
8aada9
     sss_nss_unlock();
8aada9
-- 
8aada9
2.21.3
8aada9