aboutsummaryrefslogtreecommitdiff
path: root/resolv/tst-ns_name.c
diff options
context:
space:
mode:
Diffstat (limited to 'resolv/tst-ns_name.c')
-rw-r--r--resolv/tst-ns_name.c438
1 files changed, 0 insertions, 438 deletions
diff --git a/resolv/tst-ns_name.c b/resolv/tst-ns_name.c
deleted file mode 100644
index 65eea4c827..0000000000
--- a/resolv/tst-ns_name.c
+++ /dev/null
@@ -1,438 +0,0 @@
-/* Test ns_name-related functions.
- Copyright (C) 2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-/* This test program processes the tst-ns_name.data file. */
-
-#include <ctype.h>
-#include <resolv.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <support/check.h>
-#include <support/support.h>
-#include <support/xstdio.h>
-
-/* A byte buffer and its length. */
-struct buffer
-{
- unsigned char *data;
- size_t length;
-};
-
-/* Convert a base64-encoded string to its binary representation. */
-static bool
-base64_to_buffer (const char *base64, struct buffer *result)
-{
- /* "-" denotes an empty input. */
- if (strcmp (base64, "-") == 0)
- {
- result->data = xmalloc (1);
- result->length = 0;
- return true;
- }
-
- size_t size = strlen (base64);
- unsigned char *data = xmalloc (size);
- int ret = b64_pton (base64, data, size);
- if (ret < 0 || ret > size)
- return false;
- result->data = xrealloc (data, ret);
- result->length = ret;
- return true;
-}
-
-/* A test case for ns_name_unpack and ns_name_ntop. */
-struct test_case
-{
- char *path;
- size_t lineno;
- struct buffer input;
- size_t input_offset;
- int unpack_result;
- struct buffer unpack_output;
- int ntop_result;
- char *ntop_text;
-};
-
-/* Deallocate the buffers associated with the test case. */
-static void
-free_test_case (struct test_case *t)
-{
- free (t->path);
- free (t->input.data);
- free (t->unpack_output.data);
- free (t->ntop_text);
-}
-
-/* Extract the test case information from a test file line. */
-static bool
-parse_test_case (const char *path, size_t lineno, const char *line,
- struct test_case *result)
-{
- memset (result, 0, sizeof (*result));
- result->path = xstrdup (path);
- result->lineno = lineno;
- result->ntop_result = -1;
- char *input = NULL;
- char *unpack_output = NULL;
- int ret = sscanf (line, "%ms %zu %d %ms %d %ms",
- &input, &result->input_offset,
- &result->unpack_result, &unpack_output,
- &result->ntop_result, &result->ntop_text);
- if (ret < 3)
- {
- printf ("%s:%zu: error: missing input fields\n", path, lineno);
- free (input);
- return false;
- }
- if (!base64_to_buffer (input, &result->input))
- {
- printf ("%s:%zu: error: malformed base64 input data\n", path, lineno);
- free (input);
- free (unpack_output);
- free (result->ntop_text);
- return false;
- }
- free (input);
-
- if (unpack_output == NULL)
- result->unpack_output = (struct buffer) { NULL, 0 };
- else if (!base64_to_buffer (unpack_output, &result->unpack_output))
- {
- printf ("%s:%zu: error: malformed base64 unpack data\n", path, lineno);
- free (result->input.data);
- free (unpack_output);
- free (result->ntop_text);
- return false;
- }
- free (unpack_output);
-
- /* At this point, all allocated buffers have been transferred to
- *result. */
-
- if (result->input_offset > result->input.length)
- {
- printf ("%s:%zu: error: input offset %zu exceeds buffer size %zu\n",
- path, lineno, result->input_offset, result->input.length);
- free_test_case (result);
- return false;
- }
- if (result->unpack_result < -1)
- {
- printf ("%s:%zu: error: invalid unpack result %d\n",
- path, lineno, result->unpack_result);
- free_test_case (result);
- return false;
- }
- if (result->ntop_result < -1)
- {
- printf ("%s:%zu: error: invalid ntop result %d\n",
- path, lineno, result->ntop_result);
- free_test_case (result);
- return false;
- }
-
- bool fields_consistent;
- switch (ret)
- {
- case 3:
- fields_consistent = result->unpack_result == -1;
- break;
- case 5:
- fields_consistent = result->unpack_result != -1
- && result->ntop_result == -1;
- break;
- case 6:
- fields_consistent = result->unpack_result != -1
- && result->ntop_result != -1;
- break;
- default:
- fields_consistent = false;
- }
- if (!fields_consistent)
- {
- printf ("%s:%zu: error: wrong number of fields: %d\n",
- path, lineno, ret);
- free_test_case (result);
- return false;
- }
- return true;
-}
-
-/* Format the buffer as a hexadecimal string and write it to standard
- output. */
-static void
-print_hex (const char *label, struct buffer buffer)
-{
- printf (" %s ", label);
- unsigned char *p = buffer.data;
- unsigned char *end = p + buffer.length;
- while (p < end)
- {
- printf ("%02X", *p & 0xFF);
- ++p;
- }
- putchar ('\n');
-}
-
-/* Run the test case specified in *T. */
-static void
-run_test_case (struct test_case *t)
-{
- /* Test ns_name_unpack. */
- unsigned char *unpacked = xmalloc (NS_MAXCDNAME);
- int consumed = ns_name_unpack
- (t->input.data, t->input.data + t->input.length,
- t->input.data + t->input_offset,
- unpacked, NS_MAXCDNAME);
- if (consumed != t->unpack_result)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong result from ns_name_unpack\n"
- " expected: %d\n"
- " actual: %d\n",
- t->path, t->lineno, t->unpack_result, consumed);
- return;
- }
- if (consumed != -1)
- {
- if (memcmp (unpacked, t->unpack_output.data,
- t->unpack_output.length) != 0)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong data from ns_name_unpack\n",
- t->path, t->lineno);
- print_hex ("expected:", t->unpack_output);
- print_hex ("actual: ",
- (struct buffer) { unpacked, t->unpack_output.length });
- return;
- }
-
- /* Test ns_name_ntop. */
- char *text = xmalloc (NS_MAXDNAME);
- int ret = ns_name_ntop (unpacked, text, NS_MAXDNAME);
- if (ret != t->ntop_result)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong result from ns_name_top\n"
- " expected: %d\n"
- " actual: %d\n",
- t->path, t->lineno, t->ntop_result, ret);
- return;
- }
- if (ret != -1)
- {
- if (strcmp (text, t->ntop_text) != 0)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong data from ns_name_ntop\n",
- t->path, t->lineno);
- printf (" expected: \"%s\"\n", t->ntop_text);
- printf (" actual: \"%s\"\n", text);
- return;
- }
-
- /* Test ns_name_pton. Unpacking does not check the
- NS_MAXCDNAME limit, but packing does, so we need to
- adjust the expected result. */
- int expected;
- if (t->unpack_output.length > NS_MAXCDNAME)
- expected = -1;
- else if (strcmp (text, ".") == 0)
- /* The root domain is fully qualified. */
- expected = 1;
- else
- /* The domain name is never fully qualified. */
- expected = 0;
- unsigned char *repacked = xmalloc (NS_MAXCDNAME);
- ret = ns_name_pton (text, repacked, NS_MAXCDNAME);
- if (ret != expected)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong result from ns_name_pton\n"
- " expected: %d\n"
- " actual: %d\n",
- t->path, t->lineno, expected, ret);
- return;
- }
- if (ret >= 0
- && memcmp (repacked, unpacked, t->unpack_output.length) != 0)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong data from ns_name_pton\n",
- t->path, t->lineno);
- print_hex ("expected:", t->unpack_output);
- print_hex ("actual: ",
- (struct buffer) { repacked, t->unpack_output.length });
- return;
- }
-
- /* Test ns_name_compress, no compression case. */
- if (t->unpack_output.length > NS_MAXCDNAME)
- expected = -1;
- else
- expected = t->unpack_output.length;
- memset (repacked, '$', NS_MAXCDNAME);
- {
- enum { ptr_count = 5 };
- const unsigned char *dnptrs[ptr_count] = { repacked, };
- ret = ns_name_compress (text, repacked, NS_MAXCDNAME,
- dnptrs, dnptrs + ptr_count);
- if (ret != expected)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong result from ns_name_compress\n"
- " expected: %d\n"
- " actual: %d\n",
- t->path, t->lineno, expected, ret);
- return;
- }
- if (ret < 0)
- {
- TEST_VERIFY (dnptrs[0] == repacked);
- TEST_VERIFY (dnptrs[1] == NULL);
- }
- else
- {
- if (memcmp (repacked, unpacked, t->unpack_output.length) != 0)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong data from ns_name_compress\n",
- t->path, t->lineno);
- print_hex ("expected:", t->unpack_output);
- print_hex ("actual: ", (struct buffer) { repacked, ret });
- return;
- }
- TEST_VERIFY (dnptrs[0] == repacked);
- if (unpacked[0] == '\0')
- /* The root domain is not a compression target. */
- TEST_VERIFY (dnptrs[1] == NULL);
- else
- {
- TEST_VERIFY (dnptrs[1] == repacked);
- TEST_VERIFY (dnptrs[2] == NULL);
- }
- }
- }
-
- /* Test ns_name_compress, full compression case. Skip this
- test for invalid names and the root domain. */
- if (expected >= 0 && unpacked[0] != '\0')
- {
- /* The destination buffer needs additional room for the
- offset, the initial name, and the compression
- reference. */
- enum { name_offset = 259 };
- size_t target_offset = name_offset + t->unpack_output.length;
- size_t repacked_size = target_offset + 2;
- repacked = xrealloc (repacked, repacked_size);
- memset (repacked, '@', repacked_size);
- memcpy (repacked + name_offset,
- t->unpack_output.data, t->unpack_output.length);
- enum { ptr_count = 5 };
- const unsigned char *dnptrs[ptr_count]
- = { repacked, repacked + name_offset, };
- ret = ns_name_compress
- (text, repacked + target_offset, NS_MAXCDNAME,
- dnptrs, dnptrs + ptr_count);
- if (ret != 2)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong result from ns_name_compress"
- " (2)\n"
- " expected: 2\n"
- " actual: %d\n",
- t->path, t->lineno, ret);
- return;
- }
- if (memcmp (repacked + target_offset, "\xc1\x03", 2) != 0)
- {
- support_record_failure ();
- printf ("%s:%zu: error: wrong data from ns_name_compress"
- " (2)\n"
- " expected: C103\n",
- t->path, t->lineno);
- print_hex ("actual: ",
- (struct buffer) { repacked + target_offset, ret });
- return;
- }
- TEST_VERIFY (dnptrs[0] == repacked);
- TEST_VERIFY (dnptrs[1] == repacked + name_offset);
- TEST_VERIFY (dnptrs[2] == NULL);
- }
-
- free (repacked);
- }
- free (text);
- }
- free (unpacked);
-}
-
-/* Open the file at PATH, parse the test cases contained in it, and
- run them. */
-static void
-run_test_file (const char *path)
-{
- FILE *fp = xfopen (path, "re");
- char *line = NULL;
- size_t line_allocated = 0;
- size_t lineno = 0;
-
- while (true)
- {
- ssize_t ret = getline (&line, &line_allocated, fp);
- if (ret < 0)
- {
- if (ferror (fp))
- {
- printf ("%s: error reading file: %m\n", path);
- exit (1);
- }
- TEST_VERIFY (feof (fp));
- break;
- }
-
- ++lineno;
- char *p = line;
- while (isspace (*p))
- ++p;
- if (*p == '\0' || *p == '#')
- continue;
-
- struct test_case test_case;
- if (!parse_test_case (path, lineno, line, &test_case))
- {
- support_record_failure ();
- continue;
- }
- run_test_case (&test_case);
- free_test_case (&test_case);
- }
- free (line);
- xfclose (fp);
-}
-
-static int
-do_test (void)
-{
- run_test_file ("tst-ns_name.data");
- return 0;
-}
-
-#include <support/test-driver.c>