blob: 9b5006756059efdc344dabff15df5e6ac7d05cee [file] [edit]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Differential fuzz test for llvm-libc inet_aton implementation.
///
//===----------------------------------------------------------------------===//
#include "src/__support/CPP/scope.h"
#include "src/arpa/inet/inet_aton.h"
#include "src/string/memcpy.h"
#include <arpa/inet.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
// Create a null-terminated copy of the data
char *str = new char[size + 1];
LIBC_NAMESPACE::cpp::scope_exit delete_str([&] { delete[] str; });
LIBC_NAMESPACE::memcpy(str, data, size);
str[size] = '\0';
struct in_addr ref_addr = {};
struct in_addr impl_addr = {};
int ref = ::inet_aton(str, &ref_addr);
int impl = LIBC_NAMESPACE::inet_aton(str, &impl_addr);
if (ref != impl) {
fprintf(stderr,
"Different result (reference: %d, implementation: %d) for \"%s\"\n",
ref, impl, str);
__builtin_trap();
}
if (ref == 1 && ref_addr.s_addr != impl_addr.s_addr) {
fprintf(
stderr,
"Different address (reference: %x, implementation: %x) for \"%s\"\n",
ref_addr.s_addr, impl_addr.s_addr, str);
__builtin_trap();
}
return 0;
}