Blame resolv/tst-ns_name_pton.c

Packit 6c4009
/* Tests for ns_name_pton.
Packit 6c4009
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <arpa/nameser.h>
Packit 6c4009
#include <array_length.h>
Packit 6c4009
#include <stdbool.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <support/check.h>
Packit 6c4009
#include <support/support.h>
Packit 6c4009
#include <support/test-driver.h>
Packit 6c4009
Packit 6c4009
/* Bits which indicate which functions are supposed to report
Packit 6c4009
   success.  */
Packit 6c4009
enum
Packit 6c4009
  {
Packit 6c4009
    hnok = 1,
Packit 6c4009
    dnok = 2,
Packit 6c4009
    mailok = 4,
Packit 6c4009
    ownok = 8,
Packit 6c4009
    allnomailok = hnok | dnok | ownok,
Packit 6c4009
    allok = hnok | dnok | mailok | ownok
Packit 6c4009
  };
Packit 6c4009
Packit 6c4009
/* A string of 60 characters.  */
Packit 6c4009
#define STRING60 "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
Packit 6c4009
Packit 6c4009
/* A string of 63 characters (maximum label length).  */
Packit 6c4009
#define STRING63 STRING60 "zzz"
Packit 6c4009
Packit 6c4009
/* A string of 60 bytes (non-ASCII).  */
Packit 6c4009
#define STRING60OCT \
Packit 6c4009
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
Packit 6c4009
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
Packit 6c4009
  "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
Packit 6c4009
  "\377\377\377\377\377\377\377\377\377"
Packit 6c4009
Packit 6c4009
/* A string of 63 bytes (non-ASCII).  */
Packit 6c4009
#define STRING63OCT STRING60OCT "\377\377\377"
Packit 6c4009
Packit 6c4009
/* A string of 60 bytes (non-ASCII, quoted decimal).  */
Packit 6c4009
#define STRING60DEC \
Packit 6c4009
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit 6c4009
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit 6c4009
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit 6c4009
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit 6c4009
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255" \
Packit 6c4009
  "\\255\\255\\255\\255\\255\\255\\255\\255\\255\\255"
Packit 6c4009
Packit 6c4009
/* A string of 63 bytes (non-ASCII, quoted decimal).  */
Packit 6c4009
#define STRING63DEC STRING60DEC "\\255\\255\\255"
Packit 6c4009
Packit 6c4009
/* Combines a test name with the expected results.  */
Packit 6c4009
struct test_case
Packit 6c4009
{
Packit 6c4009
  const char *dn;
Packit 6c4009
  const char *back; /* Expected test result converted using ns_name_ntop.  */
Packit 6c4009
  bool fully_qualified; /* True if the domain name has a trailing dot.  */
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
static const struct test_case tests[] =
Packit 6c4009
  {
Packit 6c4009
    { "", ".", false },
Packit 6c4009
    { ".", ".", true },
Packit 6c4009
    { "..", NULL, },
Packit 6c4009
    { "www", "www", false },
Packit 6c4009
    { "www.", "www", true },
Packit 6c4009
    { "www\\.", "www\\.", false },
Packit 6c4009
    { ".www", NULL, },
Packit 6c4009
    { ".www\\.", NULL, },
Packit 6c4009
    { "example.com", "example.com", false },
Packit 6c4009
    { "example.com.", "example.com", true },
Packit 6c4009
    { ".example.com", NULL, },
Packit 6c4009
    { ".example.com.", NULL, },
Packit 6c4009
    { "example\\.com", "example\\.com", false },
Packit 6c4009
    { "example\\.com.", "example\\.com", true },
Packit 6c4009
    { "example..", NULL, },
Packit 6c4009
    { "example..com", NULL, },
Packit 6c4009
    { "example..com", NULL, },
Packit 6c4009
    { "\\0", NULL, },
Packit 6c4009
    { "\\00", NULL, },
Packit 6c4009
    { "\\000", "\\000", false },
Packit 6c4009
    { "\\1", NULL, },
Packit 6c4009
    { "\\01", NULL, },
Packit 6c4009
    { "\\001", "\\001", false },
Packit 6c4009
    { "\\1x", NULL, },
Packit 6c4009
    { "\\01x", NULL, },
Packit 6c4009
    { "\\001x", "\\001x", false },
Packit 6c4009
    { "\\256", NULL, },
Packit 6c4009
    { "\\0641", "\\@1", false },
Packit 6c4009
    { "\\0011", "\\0011", false },
Packit 6c4009
    { STRING63, STRING63, false },
Packit 6c4009
    { STRING63 ".", STRING63, true },
Packit 6c4009
    { STRING63 "z", NULL, },
Packit 6c4009
    { STRING63 "\\.", NULL, },
Packit 6c4009
    { STRING60 "zz\\.", STRING60 "zz\\.", false },
Packit 6c4009
    { STRING60 "zz\\..", STRING60 "zz\\.", true },
Packit 6c4009
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "z",
Packit 6c4009
      STRING63 "." STRING63 "." STRING63 "." STRING60 "z", false },
Packit 6c4009
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "z.",
Packit 6c4009
      STRING63 "." STRING63 "." STRING63 "." STRING60 "z", true },
Packit 6c4009
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "zz", NULL, },
Packit 6c4009
    { STRING63 "." STRING63 "." STRING63 "." STRING60 "zzz", NULL, },
Packit 6c4009
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT "\377",
Packit 6c4009
      STRING63DEC "." STRING63DEC "." STRING63DEC "." STRING60DEC "\\255",
Packit 6c4009
      false },
Packit 6c4009
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT "\377.",
Packit 6c4009
      STRING63DEC "." STRING63DEC "." STRING63DEC "." STRING60DEC "\\255",
Packit 6c4009
      true },
Packit 6c4009
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT
Packit 6c4009
      "\377\377", NULL, },
Packit 6c4009
    { STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT
Packit 6c4009
      "\377\377\377", NULL, },
Packit 6c4009
    { "\\", NULL, },
Packit 6c4009
    { "\\\\", "\\\\", false },
Packit 6c4009
    { "\\\\.", "\\\\", true },
Packit 6c4009
    { "\\\\\\", NULL, },
Packit 6c4009
    { "a\\", NULL, },
Packit 6c4009
    { "a.\\", NULL, },
Packit 6c4009
    { "a.b\\", NULL, },
Packit 6c4009
  };
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  unsigned char *wire = xmalloc (NS_MAXCDNAME);
Packit 6c4009
  char *text = xmalloc (NS_MAXDNAME);
Packit 6c4009
  for (const struct test_case *test = tests; test < array_end (tests); ++test)
Packit 6c4009
    {
Packit 6c4009
      if (test_verbose)
Packit 6c4009
        printf ("info: testing domain name [[[%s]]]\n", test->dn);
Packit 6c4009
      int ret = ns_name_pton (test->dn, wire, NS_MAXCDNAME);
Packit 6c4009
      if (ret == -1)
Packit 6c4009
        {
Packit 6c4009
          if (test->back != NULL)
Packit 6c4009
            {
Packit 6c4009
              support_record_failure ();
Packit 6c4009
              printf ("error: unexpected decoding failure for [[%s]]\n",
Packit 6c4009
                      test->dn);
Packit 6c4009
            }
Packit 6c4009
          /* Otherwise, we have an expected decoding failure.  */
Packit 6c4009
          continue;
Packit 6c4009
        }
Packit 6c4009
Packit 6c4009
      if (ret < -1 || ret > 1)
Packit 6c4009
        {
Packit 6c4009
          support_record_failure ();
Packit 6c4009
          printf ("error: invalid return value %d for [[%s]]\n",
Packit 6c4009
                  ret, test->dn);
Packit 6c4009
          continue;
Packit 6c4009
        }
Packit 6c4009
Packit 6c4009
      int ret2 = ns_name_ntop (wire, text, NS_MAXDNAME);
Packit 6c4009
Packit 6c4009
      if (ret2 < 0)
Packit 6c4009
        {
Packit 6c4009
          support_record_failure ();
Packit 6c4009
          printf ("error: failure to convert back [[%s]]\n", test->dn);
Packit 6c4009
        }
Packit 6c4009
Packit 6c4009
      if (test->back == NULL)
Packit 6c4009
        {
Packit 6c4009
          support_record_failure ();
Packit 6c4009
          printf ("error: unexpected success converting [[%s]]\n", test->dn);
Packit 6c4009
          if (ret2 >= 1)
Packit 6c4009
            printf ("error:   result converts back to [[%s]]\n", test->dn);
Packit 6c4009
          continue;
Packit 6c4009
        }
Packit 6c4009
Packit 6c4009
      if (strcmp (text, test->back) != 0)
Packit 6c4009
        {
Packit 6c4009
          support_record_failure ();
Packit 6c4009
          printf ("error: back-conversion of [[%s]] did not match\n",
Packit 6c4009
                  test->dn);
Packit 6c4009
          printf ("error:   expected: [[%s]]\n", test->back);
Packit 6c4009
          printf ("error:     actual: [[%s]]\n", text);
Packit 6c4009
        }
Packit 6c4009
Packit 6c4009
      if (ret != test->fully_qualified)
Packit 6c4009
        {
Packit 6c4009
          support_record_failure ();
Packit 6c4009
          printf ("error: invalid fully-qualified status for [[%s]]\n",
Packit 6c4009
                  test->dn);
Packit 6c4009
          printf ("error:   expected: %d\n", (int) test->fully_qualified);
Packit 6c4009
          printf ("error:     actual: %d\n", ret);
Packit 6c4009
        }
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  free (text);
Packit 6c4009
  free (wire);
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#include <support/test-driver.c>