Advertisement
Guest User

Untitled

a guest
Jan 28th, 2015
449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 6.89 KB | None | 0 0
  1. From d5dd6189d506068ed11c8bfa1e1e9bffde04decd Mon Sep 17 00:00:00 2001
  2. From: Andreas Schwab <schwab@suse.de>
  3. Date: Mon, 21 Jan 2013 17:41:28 +0100
  4. Subject: [PATCH] Fix parsing of numeric hosts in gethostbyname_r
  5.  
  6. ---
  7. ChangeLog              |   14 +++++++++
  8.  NEWS                   |   12 ++++----
  9.  nss/Makefile           |    2 +-
  10.  nss/digits_dots.c      |   73 +++++++++++++----------------------------------
  11.  nss/getXXbyYY_r.c      |    5 ++-
  12.  nss/test-digits-dots.c |   38 +++++++++++++++++++++++++
  13.  6 files changed, 83 insertions(+), 61 deletions(-)
  14.  create mode 100644 nss/test-digits-dots.c
  15.  
  16. diff --git a/nss/Makefile b/nss/Makefile
  17. index 449a258..553eafa 100644
  18. --- a/nss/Makefile
  19. +++ b/nss/Makefile
  20. @@ -37,7 +37,7 @@ install-bin             := getent makedb
  21.  makedb-modules = xmalloc hash-string
  22.  extra-objs     += $(makedb-modules:=.o)
  23.  
  24. -tests          = test-netdb
  25. +tests          = test-netdb test-digits-dots
  26.  xtests         = bug-erange
  27.  
  28.  include ../Makeconfig
  29. diff --git a/nss/digits_dots.c b/nss/digits_dots.c
  30. index 2b86295..e007ef4 100644
  31. --- a/nss/digits_dots.c
  32. +++ b/nss/digits_dots.c
  33. @@ -46,7 +46,10 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  34.      {
  35.        if (h_errnop)
  36.     *h_errnop = NETDB_INTERNAL;
  37. -      *result = NULL;
  38. +      if (buffer_size == NULL)
  39. +   *status = NSS_STATUS_TRYAGAIN;
  40. +      else
  41. +   *result = NULL;
  42.        return -1;
  43.      }
  44.  
  45. @@ -83,14 +86,16 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  46.     }
  47.  
  48.        size_needed = (sizeof (*host_addr)
  49. -            + sizeof (*h_addr_ptrs) + strlen (name) + 1);
  50. +            + sizeof (*h_addr_ptrs)
  51. +            + sizeof (*h_alias_ptr) + strlen (name) + 1);
  52.  
  53.        if (buffer_size == NULL)
  54.          {
  55.       if (buflen < size_needed)
  56.         {
  57. +         *status = NSS_STATUS_TRYAGAIN;
  58.           if (h_errnop != NULL)
  59. -       *h_errnop = TRY_AGAIN;
  60. +       *h_errnop = NETDB_INTERNAL;
  61.           __set_errno (ERANGE);
  62.           goto done;
  63.         }
  64. @@ -109,7 +114,7 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  65.           *buffer_size = 0;
  66.           __set_errno (save);
  67.           if (h_errnop != NULL)
  68. -       *h_errnop = TRY_AGAIN;
  69. +       *h_errnop = NETDB_INTERNAL;
  70.           *result = NULL;
  71.           goto done;
  72.         }
  73. @@ -149,7 +154,9 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  74.           if (! ok)
  75.             {
  76.               *h_errnop = HOST_NOT_FOUND;
  77. -             if (buffer_size)
  78. +             if (buffer_size == NULL)
  79. +           *status = NSS_STATUS_NOTFOUND;
  80. +             else
  81.             *result = NULL;
  82.               goto done;
  83.             }
  84. @@ -190,7 +197,7 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  85.           if (buffer_size == NULL)
  86.             *status = NSS_STATUS_SUCCESS;
  87.           else
  88. -          *result = resbuf;
  89. +           *result = resbuf;
  90.           goto done;
  91.         }
  92.  
  93. @@ -201,15 +208,6 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  94.  
  95.        if ((isxdigit (name[0]) && strchr (name, ':') != NULL) || name[0] == ':')
  96.     {
  97. -     const char *cp;
  98. -     char *hostname;
  99. -     typedef unsigned char host_addr_t[16];
  100. -     host_addr_t *host_addr;
  101. -     typedef char *host_addr_list_t[2];
  102. -     host_addr_list_t *h_addr_ptrs;
  103. -     size_t size_needed;
  104. -     int addr_size;
  105. -
  106.       switch (af)
  107.         {
  108.         default:
  109. @@ -225,7 +223,10 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  110.           /* This is not possible.  We cannot represent an IPv6 address
  111.          in an `struct in_addr' variable.  */
  112.           *h_errnop = HOST_NOT_FOUND;
  113. -         *result = NULL;
  114. +         if (buffer_size == NULL)
  115. +       *status = NSS_STATUS_NOTFOUND;
  116. +         else
  117. +       *result = NULL;
  118.           goto done;
  119.  
  120.         case AF_INET6:
  121. @@ -233,42 +234,6 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  122.           break;
  123.         }
  124.  
  125. -     size_needed = (sizeof (*host_addr)
  126. -            + sizeof (*h_addr_ptrs) + strlen (name) + 1);
  127. -
  128. -     if (buffer_size == NULL && buflen < size_needed)
  129. -       {
  130. -         if (h_errnop != NULL)
  131. -       *h_errnop = TRY_AGAIN;
  132. -         __set_errno (ERANGE);
  133. -         goto done;
  134. -       }
  135. -     else if (buffer_size != NULL && *buffer_size < size_needed)
  136. -       {
  137. -         char *new_buf;
  138. -         *buffer_size = size_needed;
  139. -         new_buf = realloc (*buffer, *buffer_size);
  140. -
  141. -         if (new_buf == NULL)
  142. -       {
  143. -         save = errno;
  144. -         free (*buffer);
  145. -         __set_errno (save);
  146. -         *buffer = NULL;
  147. -         *buffer_size = 0;
  148. -         *result = NULL;
  149. -         goto done;
  150. -       }
  151. -         *buffer = new_buf;
  152. -       }
  153. -
  154. -     memset (*buffer, '\0', size_needed);
  155. -
  156. -     host_addr = (host_addr_t *) *buffer;
  157. -     h_addr_ptrs = (host_addr_list_t *)
  158. -       ((char *) host_addr + sizeof (*host_addr));
  159. -     hostname = (char *) h_addr_ptrs + sizeof (*h_addr_ptrs);
  160. -
  161.       for (cp = name;; ++cp)
  162.         {
  163.           if (!*cp)
  164. @@ -281,7 +246,9 @@ __nss_hostname_digits_dots (const char *name, struct hostent *resbuf,
  165.           if (inet_pton (AF_INET6, name, host_addr) <= 0)
  166.             {
  167.               *h_errnop = HOST_NOT_FOUND;
  168. -             if (buffer_size)
  169. +             if (buffer_size == NULL)
  170. +           *status = NSS_STATUS_NOTFOUND;
  171. +             else
  172.             *result = NULL;
  173.               goto done;
  174.             }
  175. diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c
  176. index 1067744..44d00f4 100644
  177. --- a/nss/getXXbyYY_r.c
  178. +++ b/nss/getXXbyYY_r.c
  179. @@ -179,6 +179,9 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
  180.      case -1:
  181.        return errno;
  182.      case 1:
  183. +#ifdef NEED_H_ERRNO
  184. +      any_service = true;
  185. +#endif
  186.        goto done;
  187.      }
  188.  #endif
  189. diff --git a/nss/test-digits-dots.c b/nss/test-digits-dots.c
  190. new file mode 100644
  191. index 0000000..1efa344
  192. --- /dev/null
  193. +++ b/nss/test-digits-dots.c
  194. @@ -0,0 +1,38 @@
  195. +/* Copyright (C) 2013 Free Software Foundation, Inc.
  196. +   This file is part of the GNU C Library.
  197. +
  198. +   The GNU C Library is free software; you can redistribute it and/or
  199. +   modify it under the terms of the GNU Lesser General Public
  200. +   License as published by the Free Software Foundation; either
  201. +   version 2.1 of the License, or (at your option) any later version.
  202. +
  203. +   The GNU C Library is distributed in the hope that it will be useful,
  204. +   but WITHOUT ANY WARRANTY; without even the implied warranty of
  205. +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  206. +   Lesser General Public License for more details.
  207. +
  208. +   You should have received a copy of the GNU Lesser General Public
  209. +   License along with the GNU C Library; if not, see
  210. +   <http://www.gnu.org/licenses/>.  */
  211. +
  212. +/* Testcase for BZ #15014 */
  213. +
  214. +#include <stdlib.h>
  215. +#include <netdb.h>
  216. +#include <errno.h>
  217. +
  218. +static int
  219. +do_test (void)
  220. +{
  221. +  char buf[32];
  222. +  struct hostent *result = NULL;
  223. +  struct hostent ret;
  224. +  int h_err = 0;
  225. +  int err;
  226. +
  227. +  err = gethostbyname_r ("1.2.3.4", &ret, buf, sizeof (buf), &result, &h_err);
  228. +  return err == ERANGE && h_err == NETDB_INTERNAL ? EXIT_SUCCESS : EXIT_FAILURE;
  229. +}
  230. +
  231. +#define TEST_FUNCTION do_test ()
  232. +#include "../test-skeleton.c"
  233. --
  234. 1.7.1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement