mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2025-01-27 21:35:48 +00:00
fuzz: add pcap output to help debugging fuzz crashes
This commit is contained in:
parent
a9052caf10
commit
a02f34a193
@ -67,9 +67,92 @@ static size_t remfuzz_len; /* remaining fuzz length */
|
|||||||
u32_t sys_now_offset;
|
u32_t sys_now_offset;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/** Set this to 1 and define FUZZ_DUMP_PCAP_FILE to dump tx and rx packets into
|
||||||
|
* a pcap file. At the same time, packet info is written via LWIP_DEBUGF so
|
||||||
|
* packets can be matched to other events for debugging them.
|
||||||
|
*/
|
||||||
|
#ifndef FUZZ_DUMP_PCAP
|
||||||
|
#define FUZZ_DUMP_PCAP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FUZZ_DUMP_PCAP
|
||||||
|
const u8_t pcap_file_header[24] = {
|
||||||
|
0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
static FILE* fpcap;
|
||||||
|
static u32_t pcap_packet;
|
||||||
|
|
||||||
|
static void pcap_dump_init(void)
|
||||||
|
{
|
||||||
|
fpcap = fopen(FUZZ_DUMP_PCAP_FILE, "wb");
|
||||||
|
if (fpcap != NULL) {
|
||||||
|
/* write header */
|
||||||
|
fwrite(pcap_file_header, 1, sizeof(pcap_file_header), fpcap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function might have to be called from LWIP_PLATFORM_ASSERT()
|
||||||
|
* in order to produce correct pcap results on crash. */
|
||||||
|
void pcap_dump_stop(void)
|
||||||
|
{
|
||||||
|
if (fpcap != NULL) {
|
||||||
|
fclose(fpcap);
|
||||||
|
fpcap = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pcap_dump_packet(struct pbuf *p, int is_tx)
|
||||||
|
{
|
||||||
|
if (fpcap != NULL) {
|
||||||
|
struct pbuf *q;
|
||||||
|
u32_t data;
|
||||||
|
pcap_packet++;
|
||||||
|
if (is_tx) {
|
||||||
|
LWIP_DEBUGF(FUZZ_DEBUG, ("> %d fuzz: netif: send %u bytes\n", pcap_packet, p->tot_len));
|
||||||
|
} else {
|
||||||
|
LWIP_DEBUGF(FUZZ_DEBUG, ("< %d fuzz: RX packet of %u bytes\n", pcap_packet, p->tot_len));
|
||||||
|
if (pcap_packet == 50 || pcap_packet == 33 || pcap_packet == 29) {
|
||||||
|
pcap_packet++;
|
||||||
|
pcap_packet--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* write packet header */
|
||||||
|
fwrite(&pcap_packet, 1, sizeof(pcap_packet), fpcap);
|
||||||
|
data = 0;
|
||||||
|
fwrite(&data, 1, sizeof(data), fpcap);
|
||||||
|
data = p->tot_len;
|
||||||
|
fwrite(&data, 1, sizeof(data), fpcap);
|
||||||
|
fwrite(&data, 1, sizeof(data), fpcap);
|
||||||
|
/* write packet data */
|
||||||
|
for(q = p; q != NULL; q = q->next) {
|
||||||
|
fwrite(q->payload, 1, q->len, fpcap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pcap_dump_rx_packet(struct pbuf *p)
|
||||||
|
{
|
||||||
|
pcap_dump_packet(p, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pcap_dump_tx_packet(struct pbuf *p)
|
||||||
|
{
|
||||||
|
pcap_dump_packet(p, 1);
|
||||||
|
}
|
||||||
|
#else /* FUZZ_DUMP_PCAP */
|
||||||
|
#define pcap_dump_rx_packet(p)
|
||||||
|
#define pcap_dump_tx_packet(p)
|
||||||
|
#define pcap_dump_init()
|
||||||
|
#define pcap_dump_stop()
|
||||||
|
#endif /* FUZZ_DUMP_PCAP */
|
||||||
|
|
||||||
/* no-op send function */
|
/* no-op send function */
|
||||||
static err_t lwip_tx_func(struct netif *netif, struct pbuf *p)
|
static err_t lwip_tx_func(struct netif *netif, struct pbuf *p)
|
||||||
{
|
{
|
||||||
|
pcap_dump_tx_packet(p);
|
||||||
LWIP_UNUSED_ARG(netif);
|
LWIP_UNUSED_ARG(netif);
|
||||||
LWIP_UNUSED_ARG(p);
|
LWIP_UNUSED_ARG(p);
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
@ -115,6 +198,7 @@ static void input_pkt(struct netif *netif, const u8_t *data, size_t len)
|
|||||||
}
|
}
|
||||||
remfuzz_ptr += len;
|
remfuzz_ptr += len;
|
||||||
remfuzz_len -= len;
|
remfuzz_len -= len;
|
||||||
|
pcap_dump_rx_packet(p);
|
||||||
err = netif->input(p, netif);
|
err = netif->input(p, netif);
|
||||||
if (err != ERR_OK) {
|
if (err != ERR_OK) {
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
@ -493,6 +577,7 @@ int lwip_fuzztest(int argc, char** argv, enum lwip_fuzz_type type, u32_t test_ap
|
|||||||
ip_addr_t remote_addr; /* a IPv4 addr of the destination */
|
ip_addr_t remote_addr; /* a IPv4 addr of the destination */
|
||||||
struct eth_addr remote_mac = ETH_ADDR(0x28, 0x00, 0x00, 0x22, 0x2b, 0x38); /* a MAC addr of the destination */
|
struct eth_addr remote_mac = ETH_ADDR(0x28, 0x00, 0x00, 0x22, 0x2b, 0x38); /* a MAC addr of the destination */
|
||||||
|
|
||||||
|
pcap_dump_init();
|
||||||
lwip_init();
|
lwip_init();
|
||||||
|
|
||||||
IP4_ADDR(&addr, 172, 30, 115, 84);
|
IP4_ADDR(&addr, 172, 30, 115, 84);
|
||||||
@ -576,5 +661,6 @@ int lwip_fuzztest(int argc, char** argv, enum lwip_fuzz_type type, u32_t test_ap
|
|||||||
}
|
}
|
||||||
input_pkts(type, &net_test, pktbuf, len);
|
input_pkts(type, &net_test, pktbuf, len);
|
||||||
|
|
||||||
|
pcap_dump_stop();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user