nss_winbind: When returning NSS_UNAVAIL, squash errno to ENOENT
authorGerald (Jerry) Carter <jerry@samba.org>
Wed, 20 Aug 2008 18:00:40 +0000 (13:00 -0500)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 20 Aug 2008 18:15:45 +0000 (13:15 -0500)
According to the GNU libc nss guide, we should always set
errno to ENOENT when returning NSS_UNAVAIL.

http://www.gnu.org/software/libtool/manual/libc/NSS-Modules-Interface.html#NSS-Modules-Interface

At least the MQ Series message queing service that runs
on WebSphere will fail if you return any other errno in this case.
(cherry picked from commit ee26664602445fa7798e2061f6bcbef0756d6528)

source/nsswitch/wb_common.c

index 563c38648afffa4d4c68641a4e1548d82516e588..bae54f236047a218121f32e6bd27c9a1a72306fa 100644 (file)
@@ -182,11 +182,13 @@ static int winbind_named_pipe_sock(const char *dir)
        /* Check permissions on unix socket directory */
        
        if (lstat(dir, &st) == -1) {
+               errno = ENOENT;
                return -1;
        }
        
        if (!S_ISDIR(st.st_mode) || 
            (st.st_uid != 0 && st.st_uid != geteuid())) {
+               errno = ENOENT;
                return -1;
        }
        
@@ -210,6 +212,7 @@ static int winbind_named_pipe_sock(const char *dir)
           the winbindd daemon is not running. */
 
        if (lstat(path, &st) == -1) {
+               errno = ENOENT;
                return -1;
        }
        
@@ -217,6 +220,7 @@ static int winbind_named_pipe_sock(const char *dir)
        
        if (!S_ISSOCK(st.st_mode) || 
            (st.st_uid != 0 && st.st_uid != geteuid())) {
+               errno = ENOENT;
                return -1;
        }
        
@@ -363,6 +367,7 @@ int write_sock(void *buffer, int count, int recursing, int need_priv)
  restart:
        
        if (winbind_open_pipe_sock(recursing, need_priv) == -1) {
+               errno = ENOENT;
                return -1;
        }
        
@@ -570,12 +575,18 @@ NSS_STATUS winbindd_send_request(int req_type, int need_priv,
        
        if (write_sock(request, sizeof(*request),
                       request->flags & WBFLAG_RECURSE, need_priv) == -1) {
+               /* Set ENOENT for consistency.  Required by some apps */
+               errno = ENOENT;
+               
                return NSS_STATUS_UNAVAIL;
        }
 
        if ((request->extra_len != 0) &&
            (write_sock(request->extra_data.data, request->extra_len,
                        request->flags & WBFLAG_RECURSE, need_priv) == -1)) {
+               /* Set ENOENT for consistency.  Required by some apps */
+               errno = ENOENT;
+
                return NSS_STATUS_UNAVAIL;
        }
        
@@ -599,6 +610,9 @@ NSS_STATUS winbindd_get_response(struct winbindd_response *response)
 
        /* Wait for reply */
        if (read_reply(response) == -1) {
+               /* Set ENOENT for consistency.  Required by some apps */
+               errno = ENOENT;
+
                return NSS_STATUS_UNAVAIL;
        }