1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| | //SPDX-License-Identifier: GPL-2.0-or-later
/* fuzz.h - AFL++ fuzzing support for passt
*
* Copyright Red Hat
* Author: Anshu Kumari <anskuma@redhat.com>
*/
#ifndef FUZZ_H
#define FUZZ_H
#ifdef FUZZING
#include <stdint.h>
#include <stddef.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
int fuzz_clock_gettime(clockid_t clk, struct timespec *tp);
void fuzz_clock_reset(void);
ssize_t fuzz_getrandom(void *buf, size_t buflen, unsigned int flags);
int fuzz_getsockopt(int fd, int level, int optname, void *optval,
socklen_t *optlen);
#define clock_gettime(clk, tp) fuzz_clock_gettime(clk, tp)
#define getrandom(buf, len, flags) fuzz_getrandom(buf, len, flags)
#define getsockopt(fd, level, name, val, len) \
fuzz_getsockopt(fd, level, name, val, len)
/* AFL++ buf layout: [0..11] epoll_event, [12..65547] recv payload */
#define FUZZ_RECV_OFF 12
#define FUZZ_RECV_MAX (64 * 1024)
extern const unsigned char *fuzz_recv_data;
extern int fuzz_recv_data_len;
ssize_t fuzz_recv(int fd, void *buf, size_t len, int flags);
ssize_t fuzz_recvmsg(int fd, struct msghdr *msg, int flags);
ssize_t fuzz_recvfrom(int fd, void *buf, size_t len, int flags,
struct sockaddr *src, socklen_t *addrlen);
int fuzz_recvmmsg(int fd, struct mmsghdr *mmh, unsigned int vlen,
int flags, struct timespec *timeout);
/* Override existing wrappers for recvfrom() present inside util.h*/
#undef recvfrom
#define recv(fd, buf, len, flags) fuzz_recv(fd, buf, len, flags)
#define recvmsg(fd, msg, flags) fuzz_recvmsg(fd, msg, flags)
#define recvfrom(fd, buf, len, flags, src, sl) \
fuzz_recvfrom(fd, buf, len, flags, src, sl)
#define recvmmsg(fd, mmh, vlen, flags, timeout) \
fuzz_recvmmsg(fd, mmh, vlen, flags, timeout)
#define FUZZ_TURN_PATH "/dev/shm/passt_fuzz_turn"
struct fuzz_turn {
uint32_t turn;
};
#endif
#endif
|