gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnunet] branch master updated: fix gns plugin action on NO


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated: fix gns plugin action on NOTFOUND
Date: Wed, 05 Sep 2018 15:02:16 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 727f0d8a8 fix gns plugin action on NOTFOUND
727f0d8a8 is described below

commit 727f0d8a8735dd638ff2f714f19c8c23852b99ba
Author: Christian Grothoff <address@hidden>
AuthorDate: Wed Sep 5 15:02:06 2018 +0200

    fix gns plugin action on NOTFOUND
---
 src/gns/nss/nss_gns.c       | 31 ++++++++++++++++++++++++-------
 src/gns/nss/nss_gns_query.c | 22 +++++++++++++++++-----
 src/gns/nss/nss_gns_query.h |  5 ++++-
 3 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/src/gns/nss/nss_gns.c b/src/gns/nss/nss_gns.c
index 58aab47fd..d76eac845 100644
--- a/src/gns/nss/nss_gns.c
+++ b/src/gns/nss/nss_gns.c
@@ -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;
 }
diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c
index 867ead624..032b2c93b 100644
--- a/src/gns/nss/nss_gns_query.c
+++ b/src/gns/nss/nss_gns_query.c
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <errno.h>
 
 
 /**
@@ -32,7 +33,10 @@
  * @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;
 }
diff --git a/src/gns/nss/nss_gns_query.h b/src/gns/nss/nss_gns_query.h
index 48cab4b22..bc732b3aa 100644
--- a/src/gns/nss/nss_gns_query.h
+++ b/src/gns/nss/nss_gns_query.h
@@ -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,

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]