>From eb617a980d50c7081ecb6eda0d489fc0eb8963f7 Mon Sep 17 00:00:00 2001 From: Lukas Slebodnik Date: Tue, 18 Nov 2014 12:02:10 +0100 Subject: [PATCH] sss_client: Work around glibc bug glibc is inconsistent with how it treats and returns NSS_STATUS_UNAVAIL. The sss nss plugin is present in nsswitch by default on some platforms due to glibc caching and problem with long living applications (e.g. GNOME). The SSSD nss plugin should behave as if it was functioning but had no data even thought sssd is not running. The errors have to be passed from nss plugin up to the user with minimal moidiffication. Thanks to Stephen Gallagher for initial patch. Resolves: https://fedorahosted.org/sssd/ticket/2439 --- src/conf_macros.m4 | 13 +++++++++++++ src/sss_client/common.c | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/conf_macros.m4 b/src/conf_macros.m4 index fbee81f56e484b618379f7c987ecee50ae48917e..bb283ef248ee017fd608bd85cc68666db0300fd9 100644 --- a/src/conf_macros.m4 +++ b/src/conf_macros.m4 @@ -708,6 +708,19 @@ AC_ARG_ENABLE([dbus-tests], [build_dbus_tests=yes]) AM_CONDITIONAL([BUILD_DBUS_TESTS], [test x$build_dbus_tests = xyes]) +AC_ARG_ENABLE([sss-default-nss-plugin], + [AS_HELP_STRING([--enable-sss-default-nss-plugin], + [This option change standard behaviour of sss nss + plugin. If this option is enabled the sss nss + plugin will behave as it was not in + nsswitch.conf when sssd is not running. + [default=no]])], + [], + [enable_sss-default-nss-plugin=no]) +AS_IF([test x$enable_sss-default-nss-plugin = xyes], + AC_DEFINE_UNQUOTED([NONSTANDARD_SSS_NSS_BEHAVIOUR], [1], + [whether to build sssd nss plugin with nonstandard glibc behaviour])) + AC_DEFUN([WITH_NFS], [ AC_ARG_WITH([nfsv4-idmapd-plugin], [AC_HELP_STRING([--with-nfsv4-idmapd-plugin], diff --git a/src/sss_client/common.c b/src/sss_client/common.c index ebe783aba9cfa3dc11a529e7875966f139eea1af..7c4bb7ab8769a72f943158366f358b108bfc3bdc 100644 --- a/src/sss_client/common.c +++ b/src/sss_client/common.c @@ -724,7 +724,12 @@ enum nss_status sss_nss_make_request(enum sss_cli_command cmd, ret = sss_cli_check_socket(errnop, SSS_NSS_SOCKET_NAME); if (ret != SSS_STATUS_SUCCESS) { +#ifdef NONSTANDARD_SSS_NSS_BEHAVIOUR + errno = 0; + return NSS_STATUS_NOTFOUND; +#else return NSS_STATUS_UNAVAIL; +#endif } ret = sss_cli_make_request_nochecks(cmd, rd, repbuf, replen, errnop); @@ -735,7 +740,12 @@ enum nss_status sss_nss_make_request(enum sss_cli_command cmd, return NSS_STATUS_SUCCESS; case SSS_STATUS_UNAVAIL: default: +#ifdef NONSTANDARD_SSS_NSS_BEHAVIOUR + errno = 0; + return NSS_STATUS_NOTFOUND; +#else return NSS_STATUS_UNAVAIL; +#endif } } -- 2.1.0