From af2275341e9554de16092d6ce908b31e97733bde Mon Sep 17 00:00:00 2001 From: David Cermak Date: Tue, 29 Jun 2021 15:02:48 +0200 Subject: [PATCH] mdns: Fix fuzzer IDF-mock layer Removed lwip dependencies Simplified the mocks for esp32 and esp-netif * Original commit: espressif/esp-idf@619235c2ee5a1fe8411bd2be2de8798209f95902 --- components/mdns/test_afl_fuzz_host/Makefile | 6 +- .../mdns/test_afl_fuzz_host/esp32_compat.h | 188 ------------------ .../mdns/test_afl_fuzz_host/esp32_mock.c | 2 +- .../mdns/test_afl_fuzz_host/esp32_mock.h | 159 ++++++++++++++- .../esp_netif_loopback_mock.c | 36 ---- ..._netif_objects_mock.c => esp_netif_mock.c} | 44 ++-- .../mdns/test_afl_fuzz_host/mdns_mock.h | 24 ++- components/mdns/test_afl_fuzz_host/test.c | 1 + 8 files changed, 197 insertions(+), 263 deletions(-) delete mode 100644 components/mdns/test_afl_fuzz_host/esp32_compat.h delete mode 100644 components/mdns/test_afl_fuzz_host/esp_netif_loopback_mock.c rename components/mdns/test_afl_fuzz_host/{esp_netif_objects_mock.c => esp_netif_mock.c} (64%) diff --git a/components/mdns/test_afl_fuzz_host/Makefile b/components/mdns/test_afl_fuzz_host/Makefile index 8d98d501e..4d6067bb4 100644 --- a/components/mdns/test_afl_fuzz_host/Makefile +++ b/components/mdns/test_afl_fuzz_host/Makefile @@ -3,8 +3,8 @@ FUZZ=afl-fuzz COMPONENTS_DIR=../.. COMPILER_ICLUDE_DIR=$(shell echo `which xtensa-esp32-elf-gcc | xargs dirname | xargs dirname`/xtensa-esp32-elf) -CFLAGS=-g -Wno-unused-value -Wno-missing-declarations -Wno-pointer-bool-conversion -Wno-macro-redefined -Wno-int-to-void-pointer-cast -DHOOK_MALLOC_FAILED -DESP_EVENT_H_ -D__ESP_LOG_H__ -DMDNS_TEST_MODE \ - -I. -I.. -I../include -I../private_include -I ./build/config -include esp32_compat.h \ +CFLAGS=-g -Wno-unused-value -Wno-missing-declarations -Wno-pointer-bool-conversion -Wno-macro-redefined -Wno-int-to-void-pointer-cast -DHOOK_MALLOC_FAILED -DESP_EVENT_H_ -D__ESP_LOG_H__ \ + -I. -I.. -I../include -I../private_include -I ./build/config \ -I$(COMPONENTS_DIR) \ -I$(COMPONENTS_DIR)/driver/include \ -I$(COMPONENTS_DIR)/esp_common/include \ @@ -49,7 +49,7 @@ else endif CPP=$(CC) LD=$(CC) -OBJECTS=esp32_mock.o esp_netif_loopback_mock.o mdns.o test.o esp_netif_objects_mock.o +OBJECTS=esp32_mock.o mdns.o test.o esp_netif_mock.o OS := $(shell uname) ifeq ($(OS),Darwin) diff --git a/components/mdns/test_afl_fuzz_host/esp32_compat.h b/components/mdns/test_afl_fuzz_host/esp32_compat.h deleted file mode 100644 index 984f4096b..000000000 --- a/components/mdns/test_afl_fuzz_host/esp32_compat.h +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef _ESP32_COMPAT_H_ -#define _ESP32_COMPAT_H_ - -#ifdef MDNS_TEST_MODE - -// Not to include -#define ESP_MDNS_NETWORKING_H_ -#define _TCPIP_ADAPTER_H_ - - -#ifdef USE_BSD_STRING -#include -#endif -#include -#include -#include -#include -#include -#include -#include - -#define ESP_FAIL -1 - -#define ESP_ERR_NO_MEM 0x101 -#define ESP_ERR_INVALID_ARG 0x102 -#define ESP_ERR_INVALID_STATE 0x103 -#define ESP_ERR_INVALID_SIZE 0x104 -#define ESP_ERR_NOT_FOUND 0x105 -#define ESP_ERR_NOT_SUPPORTED 0x106 -#define ESP_ERR_TIMEOUT 0x107 -#define ESP_ERR_INVALID_RESPONSE 0x108 -#define ESP_ERR_INVALID_CRC 0x109 - -#define pdTRUE true -#define pdFALSE false -#define pdPASS ( pdTRUE ) -#define pdFAIL ( pdFALSE ) - -#define portMAX_DELAY 0xFFFFFFFF -#define portTICK_PERIOD_MS 1 -#define ESP_LOGW(a,b) -#define ESP_LOGD(a,b) -#define ESP_LOGE(a,b,c) -#define ESP_LOGV(a,b,c,d) - -#define LWIP_HDR_PBUF_H -#define __ESP_SYSTEM_H__ -#define INC_TASK_H - -#define pdMS_TO_TICKS(a) a -#define portTICK_RATE_MS 10 -#define xTaskDelete(a) -#define vTaskDelete(a) free(a) -#define xSemaphoreGive(s) -#define xSemaphoreTake(s,d) true -#define xQueueCreateMutex(s) -#define _mdns_pcb_init(a,b) true -#define _mdns_pcb_deinit(a,b) true -#define xSemaphoreCreateMutex() malloc(1) -#define xSemaphoreCreateBinary() malloc(1) -#define vSemaphoreDelete(s) free(s) -#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U -#define xTaskCreatePinnedToCore(a,b,c,d,e,f,g) *(f) = malloc(1) -#define vTaskDelay(m) usleep((m)*0) -#define pbuf_free(p) free(p) -#define esp_random() (rand()%UINT32_MAX) -#define tcpip_adapter_get_ip_info(i,d) true -#define tcpip_adapter_dhcpc_get_status(a, b) TCPIP_ADAPTER_DHCP_STARTED -#define tcpip_adapter_get_ip6_linklocal(i,d) (ESP_OK) -#define tcpip_adapter_get_hostname(i, n) *(n) = "esp32-0123456789AB" - -#define IP4_ADDR(ipaddr, a,b,c,d) \ - (ipaddr)->addr = ((uint32_t)((d) & 0xff) << 24) | \ - ((uint32_t)((c) & 0xff) << 16) | \ - ((uint32_t)((b) & 0xff) << 8) | \ - (uint32_t)((a) & 0xff) -#define ip_2_ip6(ipaddr) (&((ipaddr)->u_addr.ip6)) -#define ip_2_ip4(ipaddr) (&((ipaddr)->u_addr.ip4)) - -#define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0) -#define IP_ADDR4(ipaddr,a,b,c,d) do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \ - IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0) -#define IP_ADDR6(ipaddr,i0,i1,i2,i3) do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \ - IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0) - -#define IPADDR6_INIT(a, b, c, d) { { { { a, b, c, d } } }, IPADDR_TYPE_V6 } - -typedef int32_t esp_err_t; - -typedef void * xSemaphoreHandle; -typedef void * SemaphoreHandle_t; -typedef void * xQueueHandle; -typedef void * QueueHandle_t; -typedef void * TaskHandle_t; -typedef int BaseType_t; -typedef uint32_t TickType_t; -typedef uint32_t portTickType; - - -extern const char * WIFI_EVENT; -extern const char * IP_EVENT; -extern const char * ETH_EVENT; - -/* status of DHCP client or DHCP server */ -typedef enum { - TCPIP_ADAPTER_DHCP_INIT = 0, /**< DHCP client/server in initial state */ - TCPIP_ADAPTER_DHCP_STARTED, /**< DHCP client/server already been started */ - TCPIP_ADAPTER_DHCP_STOPPED, /**< DHCP client/server already been stopped */ - TCPIP_ADAPTER_DHCP_STATUS_MAX -} tcpip_adapter_dhcp_status_t; - -struct udp_pcb { - uint8_t dummy; -}; - -struct ip4_addr { - uint32_t addr; -}; -typedef struct ip4_addr ip4_addr_t; - -struct ip6_addr { - uint32_t addr[4]; -}; -typedef struct ip6_addr ip6_addr_t; - -typedef struct { - ip4_addr_t ip; - ip4_addr_t netmask; - ip4_addr_t gw; -} tcpip_adapter_ip_info_t; - -typedef enum { - TCPIP_ADAPTER_IF_STA = 0, /**< ESP32 station interface */ - TCPIP_ADAPTER_IF_AP, /**< ESP32 soft-AP interface */ - TCPIP_ADAPTER_IF_ETH, /**< ESP32 ethernet interface */ - TCPIP_ADAPTER_IF_MAX -} tcpip_adapter_if_t; - -typedef struct { - ip6_addr_t ip; -} tcpip_adapter_ip6_info_t; - -typedef void* system_event_t; - -struct pbuf { - struct pbuf *next; - void *payload; - uint16_t tot_len; - uint16_t len; - uint8_t /*pbuf_type*/ type; - uint8_t flags; - uint16_t ref; -}; - -#define IP_GET_TYPE(ipaddr) ((ipaddr)->type) -#define IP_IS_V6_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6) -#define ip4_addr_copy(dest, src) ((dest).addr = (src).addr) -#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \ - (dest).addr[1] = (src).addr[1]; \ - (dest).addr[2] = (src).addr[2]; \ - (dest).addr[3] = (src).addr[3];}while(0) - -#define ip_addr_copy(dest, src) do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \ - ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \ - ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0) - -#include "esp32_mock.h" - -uint32_t xTaskGetTickCount(void); - - -#endif //MDNS_TEST_MODE - -#endif //_ESP32_COMPAT_H_ diff --git a/components/mdns/test_afl_fuzz_host/esp32_mock.c b/components/mdns/test_afl_fuzz_host/esp32_mock.c index d806093fc..08ac305c5 100644 --- a/components/mdns/test_afl_fuzz_host/esp32_mock.c +++ b/components/mdns/test_afl_fuzz_host/esp32_mock.c @@ -3,7 +3,7 @@ #include #include #include -#include "esp32_compat.h" +#include "esp32_mock.h" void* g_queue; int g_queue_send_shall_fail = 0; diff --git a/components/mdns/test_afl_fuzz_host/esp32_mock.h b/components/mdns/test_afl_fuzz_host/esp32_mock.h index 9f97127d2..5acf53842 100644 --- a/components/mdns/test_afl_fuzz_host/esp32_mock.h +++ b/components/mdns/test_afl_fuzz_host/esp32_mock.h @@ -1,12 +1,161 @@ -#ifndef ESP32_MOCK_H_ -#define ESP32_MOCK_H_ +// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef _ESP32_COMPAT_H_ +#define _ESP32_COMPAT_H_ + +// Skip these include files +#define ESP_MDNS_NETWORKING_H_ +#define _TCPIP_ADAPTER_H_ +#define _ESP_TASK_H_ + +#ifdef USE_BSD_STRING +#include +#endif +#include +#include +#include +#include +#include +#include +#include #include "esp_timer.h" +#define ESP_FAIL -1 + +#define ESP_ERR_NO_MEM 0x101 +#define ESP_ERR_INVALID_ARG 0x102 +#define ESP_ERR_INVALID_STATE 0x103 +#define ESP_ERR_INVALID_SIZE 0x104 +#define ESP_ERR_NOT_FOUND 0x105 +#define ESP_ERR_NOT_SUPPORTED 0x106 +#define ESP_ERR_TIMEOUT 0x107 +#define ESP_ERR_INVALID_RESPONSE 0x108 +#define ESP_ERR_INVALID_CRC 0x109 + +#define pdTRUE true +#define pdFALSE false +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) + +#define portMAX_DELAY 0xFFFFFFFF +#define portTICK_PERIOD_MS 1 +#define ESP_LOGW(a,b) +#define ESP_LOGD(a,b) +#define ESP_LOGE(a,b,c) +#define ESP_LOGV(a,b,c,d) + +#define LWIP_HDR_PBUF_H +#define __ESP_SYSTEM_H__ +#define INC_TASK_H + +#define pdMS_TO_TICKS(a) a +#define portTICK_RATE_MS 10 +#define xSemaphoreTake(s,d) true +#define xTaskDelete(a) +#define vTaskDelete(a) free(a) +#define xSemaphoreGive(s) +#define xQueueCreateMutex(s) +#define _mdns_pcb_init(a,b) true +#define _mdns_pcb_deinit(a,b) true +#define xSemaphoreCreateMutex() malloc(1) +#define xSemaphoreCreateBinary() malloc(1) +#define vSemaphoreDelete(s) free(s) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U +#define xTaskCreatePinnedToCore(a,b,c,d,e,f,g) *(f) = malloc(1) +#define vTaskDelay(m) usleep((m)*0) +#define esp_random() (rand()%UINT32_MAX) + + +#define ESP_TASK_PRIO_MAX 25 +#define ESP_TASKD_EVENT_PRIO 5 +#define _mdns_udp_pcb_write(tcpip_if, ip_protocol, ip, port, data, len) len +#define xTaskHandle TaskHandle_t + + +typedef int32_t esp_err_t; + +typedef void * xSemaphoreHandle; +typedef void * SemaphoreHandle_t; +typedef void * xQueueHandle; +typedef void * QueueHandle_t; +typedef void * TaskHandle_t; +typedef int BaseType_t; +typedef uint32_t TickType_t; +typedef uint32_t portTickType; + + +extern const char * WIFI_EVENT; +extern const char * IP_EVENT; +extern const char * ETH_EVENT; + +/* status of DHCP client or DHCP server */ +typedef enum { + TCPIP_ADAPTER_DHCP_INIT = 0, /**< DHCP client/server in initial state */ + TCPIP_ADAPTER_DHCP_STARTED, /**< DHCP client/server already been started */ + TCPIP_ADAPTER_DHCP_STOPPED, /**< DHCP client/server already been stopped */ + TCPIP_ADAPTER_DHCP_STATUS_MAX +} tcpip_adapter_dhcp_status_t; + +struct udp_pcb { + uint8_t dummy; +}; + +struct ip4_addr { + uint32_t addr; +}; +typedef struct ip4_addr ip4_addr_t; + +struct ip6_addr { + uint32_t addr[4]; +}; +typedef struct ip6_addr ip6_addr_t; + +typedef struct { + ip4_addr_t ip; + ip4_addr_t netmask; + ip4_addr_t gw; +} tcpip_adapter_ip_info_t; + +typedef enum { + TCPIP_ADAPTER_IF_STA = 0, /**< ESP32 station interface */ + TCPIP_ADAPTER_IF_AP, /**< ESP32 soft-AP interface */ + TCPIP_ADAPTER_IF_ETH, /**< ESP32 ethernet interface */ + TCPIP_ADAPTER_IF_MAX +} tcpip_adapter_if_t; + +typedef struct { + ip6_addr_t ip; +} tcpip_adapter_ip6_info_t; + +typedef void* system_event_t; + +struct pbuf { + struct pbuf *next; + void *payload; + uint16_t tot_len; + uint16_t len; + uint8_t /*pbuf_type*/ type; + uint8_t flags; + uint16_t ref; +}; + +uint32_t xTaskGetTickCount(void); typedef void (*esp_timer_cb_t)(void* arg); // Queue mock QueueHandle_t xQueueCreate( uint32_t uxQueueLength, - uint32_t uxItemSize ); + uint32_t uxItemSize ); void vQueueDelete( QueueHandle_t xQueue ); @@ -22,11 +171,9 @@ esp_err_t esp_event_handler_register(const char * event_base, int32_t event_id, esp_err_t esp_event_handler_unregister(const char * event_base, int32_t event_id, void* event_handler); -#define _mdns_udp_pcb_write(tcpip_if, ip_protocol, ip, port, data, len) len -// Task signify mock TaskHandle_t xTaskGetCurrentTaskHandle(void); void xTaskNotifyGive(TaskHandle_t task); BaseType_t xTaskNotifyWait(uint32_t bits_entry_clear, uint32_t bits_exit_clear, uint32_t *value, TickType_t wait_time ); -#endif /* ESP32_MOCK_H_ */ +#endif //_ESP32_COMPAT_H_ diff --git a/components/mdns/test_afl_fuzz_host/esp_netif_loopback_mock.c b/components/mdns/test_afl_fuzz_host/esp_netif_loopback_mock.c deleted file mode 100644 index 72ada5f9d..000000000 --- a/components/mdns/test_afl_fuzz_host/esp_netif_loopback_mock.c +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2020 Espressif Systems (Shanghai) CO LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "esp32_compat.h" -#include "esp_netif_lwip_internal.h" - -esp_err_t esp_netif_get_ip_info(esp_netif_t *esp_netif, esp_netif_ip_info_t *ip_info) -{ - return ESP_ERR_NOT_SUPPORTED; -} - -esp_err_t esp_netif_dhcpc_get_status(esp_netif_t *esp_netif, esp_netif_dhcp_status_t *status) -{ - return ESP_ERR_NOT_SUPPORTED; -} - -const char *esp_netif_get_ifkey(esp_netif_t *esp_netif) -{ - return NULL; -} - -esp_err_t esp_netif_get_ip6_linklocal(esp_netif_t *esp_netif, esp_ip6_addr_t *if_ip6) -{ - return ESP_ERR_NOT_SUPPORTED; -} diff --git a/components/mdns/test_afl_fuzz_host/esp_netif_objects_mock.c b/components/mdns/test_afl_fuzz_host/esp_netif_mock.c similarity index 64% rename from components/mdns/test_afl_fuzz_host/esp_netif_objects_mock.c rename to components/mdns/test_afl_fuzz_host/esp_netif_mock.c index 124144992..36118199b 100644 --- a/components/mdns/test_afl_fuzz_host/esp_netif_objects_mock.c +++ b/components/mdns/test_afl_fuzz_host/esp_netif_mock.c @@ -12,47 +12,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "esp_netif.h" -#include "sys/queue.h" -#include "esp_log.h" -#include "esp_netif_private.h" +#include #include +#include +#include +#include +#include "esp32_mock.h" -// -// Purpose of this module is to provide list of esp-netif structures -// - this module has no dependency on a specific network stack (lwip) -// +typedef struct esp_netif_s esp_netif_t; +typedef struct esp_netif_ip_info esp_netif_ip_info_t; +typedef struct esp_netif_dhcp_status esp_netif_dhcp_status_t; -struct slist_netifs_s { - esp_netif_t *netif; - SLIST_ENTRY(slist_netifs_s) next; -}; -SLIST_HEAD(slisthead, slist_netifs_s) s_head = { .slh_first = NULL, }; +const char * IP_EVENT = "IP_EVENT"; -static size_t s_esp_netif_counter = 0; -ESP_EVENT_DEFINE_BASE(IP_EVENT); - -// -// List manipulation functions -// esp_err_t esp_netif_add_to_list(esp_netif_t *netif) { return ESP_OK; } - esp_err_t esp_netif_remove_from_list(esp_netif_t *netif) { return ESP_ERR_NOT_FOUND; } -size_t esp_netif_get_nr_of_ifs(void) -{ - return s_esp_netif_counter; -} - esp_netif_t* esp_netif_next(esp_netif_t* netif) { return NULL; @@ -67,3 +51,13 @@ esp_netif_t *esp_netif_get_handle_from_ifkey(const char *if_key) { return NULL; } + +esp_err_t esp_netif_get_ip_info(esp_netif_t *esp_netif, esp_netif_ip_info_t *ip_info) +{ + return ESP_ERR_NOT_SUPPORTED; +} + +esp_err_t esp_netif_dhcpc_get_status(esp_netif_t *esp_netif, esp_netif_dhcp_status_t *status) +{ + return ESP_ERR_NOT_SUPPORTED; +} diff --git a/components/mdns/test_afl_fuzz_host/mdns_mock.h b/components/mdns/test_afl_fuzz_host/mdns_mock.h index 73ae1568a..1898de2c0 100644 --- a/components/mdns/test_afl_fuzz_host/mdns_mock.h +++ b/components/mdns/test_afl_fuzz_host/mdns_mock.h @@ -1,5 +1,21 @@ #pragma once -#define ERR_OK 0 -#define IPADDR_TYPE_V4 0U -#define IPADDR_TYPE_V6 6U -#define IPADDR_TYPE_ANY 46U +#include "esp32_mock.h" +#include "mdns.h" +#include "mdns_private.h" + + +static inline void* _mdns_get_packet_data(mdns_rx_packet_t *packet) +{ + return packet->pb->payload; +} + +static inline size_t _mdns_get_packet_len(mdns_rx_packet_t *packet) +{ + return packet->pb->len; +} + +static inline void _mdns_packet_free(mdns_rx_packet_t *packet) +{ + free(packet->pb); + free(packet); +} diff --git a/components/mdns/test_afl_fuzz_host/test.c b/components/mdns/test_afl_fuzz_host/test.c index 58b304e92..e7fe0b20e 100644 --- a/components/mdns/test_afl_fuzz_host/test.c +++ b/components/mdns/test_afl_fuzz_host/test.c @@ -18,6 +18,7 @@ #include #include +#include "esp32_mock.h" #include "mdns.h" #include "mdns_private.h"