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)
committerKarolin Seeger <kseeger@samba.org>
Thu, 28 Aug 2008 14:05:43 +0000 (16:05 +0200)
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)
(cherry picked from commit 29b39723b82f363d32dc4678d6b71a78485c65ce)

source/nsswitch/wb_common.c

index b113fc3..6e6d2bb 100644 (file)
@@ -176,11 +176,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;
        }
 
@@ -199,6 +201,7 @@ static int winbind_named_pipe_sock(const char *dir)
           the winbindd daemon is not running. */
 
        if (lstat(path, &st) == -1) {
+               errno = ENOENT;
                SAFE_FREE(path);
                return -1;
        }
@@ -208,6 +211,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;
        }
 
@@ -368,6 +372,7 @@ int winbind_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;
        }
        
@@ -564,7 +569,11 @@ NSS_STATUS winbindd_send_request(int req_type, int need_priv,
        
        if (winbind_write_sock(request, sizeof(*request),
                               request->wb_flags & WBFLAG_RECURSE,
-                              need_priv) == -1) {
+                              need_priv) == -1) 
+       {
+               /* Set ENOENT for consistency.  Required by some apps */
+               errno = ENOENT;
+               
                return NSS_STATUS_UNAVAIL;
        }
 
@@ -572,7 +581,11 @@ NSS_STATUS winbindd_send_request(int req_type, int need_priv,
            (winbind_write_sock(request->extra_data.data,
                                request->extra_len,
                                request->wb_flags & WBFLAG_RECURSE,
-                               need_priv) == -1)) {
+                               need_priv) == -1)) 
+       {
+               /* Set ENOENT for consistency.  Required by some apps */
+               errno = ENOENT;
+
                return NSS_STATUS_UNAVAIL;
        }
        
@@ -596,6 +609,9 @@ NSS_STATUS winbindd_get_response(struct winbindd_response *response)
 
        /* Wait for reply */
        if (winbindd_read_reply(response) == -1) {
+               /* Set ENOENT for consistency.  Required by some apps */
+               errno = ENOENT;
+
                return NSS_STATUS_UNAVAIL;
        }