Blame resolv/tst-resolv-trailing.c

Packit Service 5009a8
/* Test name resolution behavior with trailing characters.
Packit Service 5009a8
   Copyright (C) 2019 Free Software Foundation, Inc.
Packit Service 5009a8
   This file is part of the GNU C Library.
Packit Service 5009a8
Packit Service 5009a8
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 5009a8
   modify it under the terms of the GNU Lesser General Public
Packit Service 5009a8
   License as published by the Free Software Foundation; either
Packit Service 5009a8
   version 2.1 of the License, or (at your option) any later version.
Packit Service 5009a8
Packit Service 5009a8
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 5009a8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 5009a8
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 5009a8
   Lesser General Public License for more details.
Packit Service 5009a8
Packit Service 5009a8
   You should have received a copy of the GNU Lesser General Public
Packit Service 5009a8
   License along with the GNU C Library; if not, see
Packit Service 5009a8
   <http://www.gnu.org/licenses/>.  */
Packit Service 5009a8
Packit Service 5009a8
#include <array_length.h>
Packit Service 5009a8
#include <netdb.h>
Packit Service 5009a8
#include <support/check.h>
Packit Service 5009a8
#include <support/check_nss.h>
Packit Service 5009a8
#include <support/resolv_test.h>
Packit Service 5009a8
#include <support/support.h>
Packit Service 5009a8
Packit Service 5009a8
static void
Packit Service 5009a8
response (const struct resolv_response_context *ctx,
Packit Service 5009a8
          struct resolv_response_builder *b,
Packit Service 5009a8
          const char *qname, uint16_t qclass, uint16_t qtype)
Packit Service 5009a8
{
Packit Service 5009a8
  /* The tests are not supposed send any DNS queries.  */
Packit Service 5009a8
  FAIL_EXIT1 ("unexpected DNS query for %s/%d/%d", qname, qclass, qtype);
Packit Service 5009a8
}
Packit Service 5009a8
Packit Service 5009a8
static int
Packit Service 5009a8
do_test (void)
Packit Service 5009a8
{
Packit Service 5009a8
  struct resolv_test *aux = resolv_test_start
Packit Service 5009a8
    ((struct resolv_redirect_config)
Packit Service 5009a8
     {
Packit Service 5009a8
       .response_callback = response,
Packit Service 5009a8
     });
Packit Service 5009a8
Packit Service 5009a8
  static const char *const queries[] =
Packit Service 5009a8
    {
Packit Service 5009a8
     "192.0.2.1 ",
Packit Service 5009a8
     "192.0.2.2\t",
Packit Service 5009a8
     "192.0.2.3\n",
Packit Service 5009a8
     "192.0.2.4 X",
Packit Service 5009a8
     "192.0.2.5\tY",
Packit Service 5009a8
     "192.0.2.6\nZ",
Packit Service 5009a8
     "192.0.2. ",
Packit Service 5009a8
     "192.0.2.\t",
Packit Service 5009a8
     "192.0.2.\n",
Packit Service 5009a8
     "192.0.2. X",
Packit Service 5009a8
     "192.0.2.\tY",
Packit Service 5009a8
     "192.0.2.\nZ",
Packit Service 5009a8
     "2001:db8::1 ",
Packit Service 5009a8
     "2001:db8::2\t",
Packit Service 5009a8
     "2001:db8::3\n",
Packit Service 5009a8
     "2001:db8::4 X",
Packit Service 5009a8
     "2001:db8::5\tY",
Packit Service 5009a8
     "2001:db8::6\nZ",
Packit Service 5009a8
    };
Packit Service 5009a8
  for (size_t query_idx = 0; query_idx < array_length (queries); ++query_idx)
Packit Service 5009a8
    {
Packit Service 5009a8
      const char *query = queries[query_idx];
Packit Service 5009a8
      struct hostent storage;
Packit Service 5009a8
      char buf[4096];
Packit Service 5009a8
      struct hostent *e;
Packit Service 5009a8
Packit Service 5009a8
      h_errno = 0;
Packit Service 5009a8
      TEST_VERIFY (gethostbyname (query) == NULL);
Packit Service 5009a8
      TEST_COMPARE (h_errno, HOST_NOT_FOUND);
Packit Service 5009a8
Packit Service 5009a8
      h_errno = 0;
Packit Service 5009a8
      e = NULL;
Packit Service 5009a8
      TEST_COMPARE (gethostbyname_r (query, &storage, buf, sizeof (buf),
Packit Service 5009a8
                                     &e, &h_errno), 0);
Packit Service 5009a8
      TEST_VERIFY (e == NULL);
Packit Service 5009a8
      TEST_COMPARE (h_errno, HOST_NOT_FOUND);
Packit Service 5009a8
Packit Service 5009a8
      h_errno = 0;
Packit Service 5009a8
      TEST_VERIFY (gethostbyname2 (query, AF_INET) == NULL);
Packit Service 5009a8
      TEST_COMPARE (h_errno, HOST_NOT_FOUND);
Packit Service 5009a8
Packit Service 5009a8
      h_errno = 0;
Packit Service 5009a8
      e = NULL;
Packit Service 5009a8
      TEST_COMPARE (gethostbyname2_r (query, AF_INET,
Packit Service 5009a8
                                      &storage, buf, sizeof (buf),
Packit Service 5009a8
                                     &e, &h_errno), 0);
Packit Service 5009a8
      TEST_VERIFY (e == NULL);
Packit Service 5009a8
      TEST_COMPARE (h_errno, HOST_NOT_FOUND);
Packit Service 5009a8
Packit Service 5009a8
      h_errno = 0;
Packit Service 5009a8
      TEST_VERIFY (gethostbyname2 (query, AF_INET6) == NULL);
Packit Service 5009a8
      TEST_COMPARE (h_errno, HOST_NOT_FOUND);
Packit Service 5009a8
Packit Service 5009a8
      h_errno = 0;
Packit Service 5009a8
      e = NULL;
Packit Service 5009a8
      TEST_COMPARE (gethostbyname2_r (query, AF_INET6,
Packit Service 5009a8
                                      &storage, buf, sizeof (buf),
Packit Service 5009a8
                                     &e, &h_errno), 0);
Packit Service 5009a8
      TEST_VERIFY (e == NULL);
Packit Service 5009a8
      TEST_COMPARE (h_errno, HOST_NOT_FOUND);
Packit Service 5009a8
Packit Service 5009a8
      static const int gai_flags[] =
Packit Service 5009a8
        {
Packit Service 5009a8
         0,
Packit Service 5009a8
         AI_ADDRCONFIG,
Packit Service 5009a8
         AI_NUMERICHOST,
Packit Service 5009a8
         AI_IDN,
Packit Service 5009a8
         AI_IDN | AI_NUMERICHOST,
Packit Service 5009a8
         AI_V4MAPPED,
Packit Service 5009a8
         AI_V4MAPPED | AI_NUMERICHOST,
Packit Service 5009a8
        };
Packit Service 5009a8
      for (size_t gai_flags_idx; gai_flags_idx < array_length (gai_flags);
Packit Service 5009a8
             ++gai_flags_idx)
Packit Service 5009a8
        {
Packit Service 5009a8
          struct addrinfo hints = { .ai_flags = gai_flags[gai_flags_idx], };
Packit Service 5009a8
          struct addrinfo *ai;
Packit Service 5009a8
          hints.ai_family = AF_INET;
Packit Service 5009a8
          TEST_COMPARE (getaddrinfo (query, "80", &hints, &ai), EAI_NONAME);
Packit Service 5009a8
          hints.ai_family = AF_INET6;
Packit Service 5009a8
          TEST_COMPARE (getaddrinfo (query, "80", &hints, &ai), EAI_NONAME);
Packit Service 5009a8
          hints.ai_family = AF_UNSPEC;
Packit Service 5009a8
          TEST_COMPARE (getaddrinfo (query, "80", &hints, &ai), EAI_NONAME);
Packit Service 5009a8
        }
Packit Service 5009a8
    };
Packit Service 5009a8
Packit Service 5009a8
  resolv_test_end (aux);
Packit Service 5009a8
Packit Service 5009a8
  return 0;
Packit Service 5009a8
}
Packit Service 5009a8
Packit Service 5009a8
#include <support/test-driver.c>