fix gns plugin action on NOTFOUND
authorChristian Grothoff <christian@grothoff.org>
Wed, 5 Sep 2018 13:02:06 +0000 (15:02 +0200)
committerChristian Grothoff <christian@grothoff.org>
Wed, 5 Sep 2018 13:02:06 +0000 (15:02 +0200)
src/gns/nss/nss_gns.c
src/gns/nss/nss_gns_query.c
src/gns/nss/nss_gns_query.h

index 58aab47fd5e7139a4047b80ff5f0ff16fde2076c..d76eac8452e2285e4978ae775175d7cb8e4307c1 100644 (file)
@@ -29,6 +29,7 @@
 #include <nss.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <errno.h>
 
 #include "nss_gns_query.h"
 
@@ -94,8 +95,8 @@ _nss_gns_gethostbyname2_r(const char *name,
 
   address_length = (af == AF_INET) ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t);
   if (buflen <
-      sizeof(char*)+    /* alias names */
-      strlen(name)+1)
+      sizeof(char*) +     /* alias names */
+      strlen (name) + 1)
   {   /* official name */
     *errnop = ERANGE;
     *h_errnop = NO_RECOVERY;
@@ -108,24 +109,34 @@ _nss_gns_gethostbyname2_r(const char *name,
   i = gns_resolve_name (af,
                         name,
                         &u);
-  if (-3 == i)
+  if (-1 == i)
   {
-    status = NSS_STATUS_NOTFOUND;
+    *errnop = errno;
+    status = NSS_STATUS_UNAVAIL;
+    *h_errnop = NO_RECOVERY;
     goto finish;
   }
   if (-2 == i)
   {
+    *errnop = ENOENT;
+    *h_errnop = NO_RECOVERY;
     status = NSS_STATUS_UNAVAIL;
     goto finish;
   }
-  if ( (-1 == i) ||
-       (u.count == 0) )
+  if (-3 == i)
   {
     *errnop = ETIMEDOUT;
     *h_errnop = HOST_NOT_FOUND;
     status = NSS_STATUS_NOTFOUND;
     goto finish;
   }
+  if (0 == u.count) 
+  {
+    *errnop = 0; /* success */ 
+    *h_errnop = NO_DATA; /* success */
+    status = NSS_STATUS_NOTFOUND;
+    goto finish;
+  }
   /* Alias names */
   *((char**) buffer) = NULL;
   result->h_aliases = (char**) buffer;
@@ -227,8 +238,14 @@ _nss_gns_gethostbyaddr_r (const void* addr,
                           int *errnop,
                           int *h_errnop)
 {
+  (void) addr;
+  (void) len;
+  (void) af;
+  (void) result;
+  (void) buffer;
+  (void) buflen;
   *errnop = EINVAL;
   *h_errnop = NO_RECOVERY;
-  //NOTE we allow to leak this into DNS so no NOTFOUND
+  /* NOTE we allow to leak this into DNS so no NOTFOUND */
   return NSS_STATUS_UNAVAIL;
 }
index 867ead6247b6be9da5101c60ee886cee853e4331..032b2c93bd3752b2ce5a4e5e8b899876c21601b5 100644 (file)
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <errno.h>
 
 
 /**
  * @param af address family
  * @param name the name to resolve
  * @param u the userdata (result struct)
- * @return -1 on error else 0
+ * @return -1 on internal error,
+ *         -2 if request is not for GNS,
+ *         -3 on timeout,
+ *          else 0
  */
 int
 gns_resolve_name (int af,
@@ -43,6 +47,7 @@ gns_resolve_name (int af,
   char *cmd;
   char line[128];
   int ret;
+  int es;
 
   if (AF_INET6 == af)
   {
@@ -62,7 +67,9 @@ gns_resolve_name (int af,
   }
   if (NULL == (p = popen (cmd, "r")))
   {
+    es = errno;
     free (cmd);
+    errno = es;
     return -1;
   }
   while (NULL != fgets (line,
@@ -85,8 +92,9 @@ gns_resolve_name (int af,
        }
        else
        {
-         pclose (p);
+         (void) pclose (p);
          free (cmd);
+         errno = EINVAL;
          return -1;
        }
       }
@@ -101,8 +109,9 @@ gns_resolve_name (int af,
        }
        else
         {
-         pclose (p);
+         (void) pclose (p);
          free (cmd);
+         errno = EINVAL;
          return -1;
        }
       }
@@ -110,11 +119,14 @@ gns_resolve_name (int af,
   }
   ret = pclose (p);
   free (cmd);
-  if (4 == ret)
+  if (! WIFEXITED (ret)) 
+    return -1;
+  if (4 == WEXITSTATUS (ret)) 
     return -2; /* not for GNS */
   if (3 == ret)
     return -3; /* timeout -> not found */
-  if ( (2 == ret) || (1 == ret) )
+  if ( (2 == WEXITSTATUS (ret)) ||
+       (1 == WEXITSTATUS (ret)) )
     return -2; /* launch failure -> service unavailable */
   return 0;
 }
index 48cab4b224ac55b69df9144223fe3bd1abb0b0ae..bc732b3aaaa769dcb6a2b9994dd4df39db566358 100644 (file)
@@ -57,7 +57,10 @@ struct userdata
  * @param af address family
  * @param name the name to resolve
  * @param u the userdata (result struct)
- * @return -1 on error else 0
+ * @return -1 on internal error,
+ *         -2 if request is not for GNS,
+ *         -3 on timeout,
+ *          else 0
  */
 int
 gns_resolve_name(int af,