//SPDX-License-Identifier: GPL-2.0-or-later /* fuzz.h - AFL++ fuzzing support for passt * * Copyright Red Hat * Author: Anshu Kumari */ #ifndef FUZZ_H #define FUZZ_H #ifdef FUZZING #include #include #include #include #include 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