]>
The Tcpdump Group git mirrors - libpcap/blob - testprogs/fuzz/fuzz_both.c
10 FILE * outfile
= NULL
;
12 static int bufferToFile(const char * name
, const uint8_t *Data
, size_t Size
) {
14 if (remove(name
) != 0) {
15 if (errno
!= ENOENT
) {
16 printf("failed remove, errno=%d\n", errno
);
20 fd
= fopen(name
, "wb");
22 printf("failed open, errno=%d\n", errno
);
25 if (fwrite (Data
, 1, Size
, fd
) != Size
) {
33 void fuzz_openFile(const char * name
) {
34 if (outfile
!= NULL
) {
37 outfile
= fopen(name
, "w");
40 int LLVMFuzzerTestOneInput(const uint8_t *Data
, size_t Size
) {
42 char errbuf
[PCAP_ERRBUF_SIZE
];
43 char filename
[FILENAME_MAX
] = { 0 };
45 struct pcap_pkthdr
*header
;
49 struct bpf_program bpf
;
52 //initialize output file
53 if (outfile
== NULL
) {
54 outfile
= fopen("/dev/null", "w");
55 if (outfile
== NULL
) {
64 if (Size
< 1+filterSize
|| filterSize
== 0) {
68 //generate temporary file name
69 snprintf(filename
, FILENAME_MAX
, "/tmp/libpcap_fuzz_both.XXXXXX");
70 if ((fd
= mkstemp(filename
)) < 0) {
75 //rewrite buffer to a file as libpcap does not have buffer inputs
76 if (bufferToFile(filename
, Data
+1+filterSize
, Size
-(1+filterSize
)) < 0) {
81 //initialize structure
82 pkts
= pcap_open_offline(filename
, errbuf
);
84 fprintf(outfile
, "Couldn't open pcap file %s\n", errbuf
);
89 filter
= malloc(filterSize
);
90 memcpy(filter
, Data
+1, filterSize
);
91 //null terminate string
92 filter
[filterSize
-1] = 0;
94 if (pcap_compile(pkts
, &bpf
, filter
, 1, PCAP_NETMASK_UNKNOWN
) == 0) {
96 r
= pcap_next_ex(pkts
, &header
, &pkt
);
99 fprintf(outfile
, "packet length=%d/%d filter=%d\n",header
->caplen
, header
->len
, pcap_offline_filter(&bpf
, header
, pkt
));
100 r
= pcap_next_ex(pkts
, &header
, &pkt
);