Add AFL fuzz test

* Original commit: espressif/esp-idf@4c2622755d
This commit is contained in:
me-no-dev
2017-04-03 16:50:12 +03:00
committed by suren-gabrielyan-espressif
parent 75de31cea3
commit 4a8582f500
21 changed files with 542 additions and 19 deletions

View File

@ -14,6 +14,7 @@
#include "mdns.h"
#include <string.h>
#ifndef MDNS_TEST_MODE
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
@ -23,6 +24,7 @@
#include "lwip/igmp.h"
#include "lwip/udp.h"
#include "esp_wifi.h"
#endif
#define MDNS_FLAGS_AUTHORITATIVE 0x8400
@ -162,6 +164,9 @@ static const char * MDNS_DEFAULT_DOMAIN = "local";
static const char * MDNS_SUB_STR = "_sub";
static mdns_server_t * _mdns_servers[TCPIP_ADAPTER_IF_MAX] = {0,0,0};
#ifndef MDNS_TEST_MODE
static TaskHandle_t _mdns_service_task_handle = NULL;
static QueueSetHandle_t _mdns_queue_set = NULL;
@ -257,6 +262,7 @@ esp_err_t _mdns_server_deinit(mdns_server_t * server)
}
return ESP_OK;
}
#endif
/**
* @brief send packet over UDP
@ -269,25 +275,28 @@ esp_err_t _mdns_server_deinit(mdns_server_t * server)
*/
static size_t _mdns_server_write(mdns_server_t * server, uint8_t * data, size_t len)
{
struct pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
if (pbt == NULL) {
return 0;
}
uint8_t* dst = (uint8_t *)pbt->payload;
memcpy(dst, data, len);
err_t err = udp_sendto(server->pcb, pbt, &(server->pcb->remote_ip), server->pcb->remote_port);
pbuf_free(pbt);
if (err) {
return 0;
}
return len;
#ifndef MDNS_TEST_MODE
struct pbuf* pbt = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
if (pbt == NULL) {
return 0;
}
uint8_t* dst = (uint8_t *)pbt->payload;
memcpy(dst, data, len);
err_t err = udp_sendto(server->pcb, pbt, &(server->pcb->remote_ip), server->pcb->remote_port);
pbuf_free(pbt);
if (err) {
return 0;
}
#endif
return len;
}
/*
* MDNS Servers
* */
static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len);
#ifndef MDNS_TEST_MODE
void mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len);
/**
* @brief the main MDNS service task. Packets are received and parsed here
@ -305,7 +314,7 @@ static void _mdns_service_task(void *pvParameters)
mdns_server_t * server = _mdns_servers[i];
if (server && server->queue == queue) {
MDNS_MUTEX_LOCK();
_mdns_parse_packet(server, (uint8_t*)pb->payload, pb->len);
mdns_parse_packet(server, (uint8_t*)pb->payload, pb->len);
MDNS_MUTEX_UNLOCK();
break;
}
@ -314,6 +323,7 @@ static void _mdns_service_task(void *pvParameters)
}
}
}
#endif
/**
* @brief get the server assigned to particular interface
@ -342,6 +352,7 @@ static mdns_server_t * _mdns_server_get(tcpip_adapter_if_t tcpip_if)
*/
static esp_err_t _mdns_server_add(mdns_server_t * server)
{
#ifndef MDNS_TEST_MODE
if (!_mdns_service_semaphore) {
_mdns_service_semaphore = xSemaphoreCreateMutex();
if (!_mdns_service_semaphore) {
@ -374,7 +385,7 @@ static esp_err_t _mdns_server_add(mdns_server_t * server)
if (err) {
return err;
}
#endif
_mdns_servers[server->tcpip_if] = server;
return ESP_OK;
@ -392,7 +403,7 @@ static esp_err_t _mdns_server_add(mdns_server_t * server)
static esp_err_t _mdns_server_remove(mdns_server_t * server)
{
_mdns_servers[server->tcpip_if] = NULL;
#ifndef MDNS_TEST_MODE
//stop UDP
_mdns_server_deinit(server);
@ -417,7 +428,7 @@ static esp_err_t _mdns_server_remove(mdns_server_t * server)
}
MDNS_SERVICE_UNLOCK();
}
#endif
return ESP_OK;
}
@ -1294,7 +1305,7 @@ static inline uint16_t _mdns_read_u16(const uint8_t * packet, uint16_t index)
* @param data byte array holding the packet data
* @param len length of the byte array
*/
static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len)
void mdns_parse_packet(mdns_server_t * server, const uint8_t * data, size_t len)
{
static mdns_name_t n;
static mdns_result_temp_t a;
@ -1401,7 +1412,6 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
const uint8_t * data_ptr = content + MDNS_DATA_OFFSET;
content = data_ptr + data_len;
if(content > (data + len)){
return;
}
@ -1410,18 +1420,22 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
if (!_mdns_parse_fqdn(data, data_ptr, name)) {
continue;//error
}
#ifndef MDNS_TEST_MODE
if (server->search.host[0] ||
(strcmp(name->service, server->search.service) != 0) ||
(strcmp(name->proto, server->search.proto) != 0)) {
continue;//not searching for service or wrong service/proto
}
#endif
strlcpy(answer->instance, name->host, MDNS_NAME_BUF_LEN);
} else if (type == MDNS_TYPE_SRV) {
#ifndef MDNS_TEST_MODE
if (server->search.host[0] ||
(strcmp(name->service, server->search.service) != 0) ||
(strcmp(name->proto, server->search.proto) != 0)) {
continue;//not searching for service or wrong service/proto
}
#endif
if (answer->instance[0]) {
if (strcmp(answer->instance, name->host) != 0) {
continue;//instance name is not the same as the one in the PTR record
@ -1468,9 +1482,11 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
answer->txt[b] = 0;
} else if (type == MDNS_TYPE_AAAA) {
if (server->search.host[0]) {
#ifndef MDNS_TEST_MODE
if (strcmp(name->host, server->search.host) != 0) {
continue;//wrong host
}
#endif
} else if (!answer->ptr) {
strlcpy(answer->host, name->host, MDNS_NAME_BUF_LEN);
} else if (strcmp(answer->host, name->host) != 0) {
@ -1479,9 +1495,11 @@ static void _mdns_parse_packet(mdns_server_t * server, const uint8_t * data, siz
memcpy(answer->addrv6, data_ptr, sizeof(ip6_addr_t));
} else if (type == MDNS_TYPE_A) {
if (server->search.host[0]) {
#ifndef MDNS_TEST_MODE
if (strcmp(name->host, server->search.host) != 0) {
continue;//wrong host
}
#endif
} else if (!answer->ptr) {
strlcpy(answer->host, name->host, MDNS_NAME_BUF_LEN);
} else if (strcmp(answer->host, name->host) != 0) {