1
0
Fork 0
bind9/fuzz/dns_name_fromwire.c
Daniel Baumann f66ff7eae6
Adding upstream version 1:9.20.9.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 13:32:37 +02:00

103 lines
2.8 KiB
C

/*
* Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* SPDX-License-Identifier: MPL-2.0
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at https://mozilla.org/MPL/2.0/.
*
* See the COPYRIGHT file distributed with this work for additional
* information regarding copyright ownership.
*/
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <isc/ascii.h>
#include <isc/buffer.h>
#include <isc/util.h>
#include <dns/compress.h>
#include <dns/fixedname.h>
#include <dns/name.h>
#include "fuzz.h"
#include "old.h"
bool debug = false;
int
LLVMFuzzerInitialize(int *argc ISC_ATTR_UNUSED, char ***argv ISC_ATTR_UNUSED) {
return 0;
}
int
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
isc_result_t new_result;
isc_result_t old_result;
dns_fixedname_t new_fixed;
dns_fixedname_t old_fixed;
dns_name_t *new_name = dns_fixedname_initname(&new_fixed);
dns_name_t *old_name = dns_fixedname_initname(&old_fixed);
uint8_t *new_offsets;
uint8_t *old_offsets;
dns_decompress_t dctx = DNS_DECOMPRESS_PERMITTED;
isc_buffer_t new_buf;
isc_buffer_t old_buf;
/*
* Output buffers may be partially used or undersized.
*/
if (size > 0) {
uint8_t add = *data++;
size--;
isc_buffer_add(&new_fixed.buffer, add);
isc_buffer_add(&old_fixed.buffer, add);
}
/*
* timeout faster if we hit a pointer loop
*/
alarm(1);
/*
* We shift forward by half the input data to make an area
* that pointers can refer back to.
*/
isc_buffer_constinit(&new_buf, data, size);
isc_buffer_add(&new_buf, size);
isc_buffer_setactive(&new_buf, size);
isc_buffer_forward(&new_buf, size / 2);
new_result = dns_name_fromwire(new_name, &new_buf, dctx, NULL);
isc_buffer_constinit(&old_buf, data, size);
isc_buffer_add(&old_buf, size);
isc_buffer_setactive(&old_buf, size);
isc_buffer_forward(&old_buf, size / 2);
old_result = old_name_fromwire(old_name, &old_buf, dctx, 0, NULL);
REQUIRE(new_result == old_result);
REQUIRE(dns_name_equal(new_name, old_name));
REQUIRE(new_name->labels == old_name->labels);
new_offsets = new_name->offsets;
old_offsets = old_name->offsets;
REQUIRE(new_offsets != NULL && old_offsets != NULL);
REQUIRE(memcmp(new_offsets, old_offsets, old_name->labels) == 0);
REQUIRE(new_fixed.buffer.current == old_fixed.buffer.current);
REQUIRE(new_fixed.buffer.active == old_fixed.buffer.active);
REQUIRE(new_fixed.buffer.used == old_fixed.buffer.used);
REQUIRE(new_fixed.buffer.length == old_fixed.buffer.length);
REQUIRE(new_buf.base == old_buf.base);
REQUIRE(new_buf.current == old_buf.current);
REQUIRE(new_buf.active == old_buf.active);
REQUIRE(new_buf.used == old_buf.used);
REQUIRE(new_buf.length == old_buf.length);
return 0;
}