| //===----------------------------------------------------------------------===// | |
| // | |
| // 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; | |
| } |