#include #include #include #include #include static void myfuzz(void) { // INIT HTTP SERVER pid_t fuzz_server = fork(); if (fuzz_server == 0) { //receive request struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 1000000; int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); setsockopt(serv_sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)); setsockopt(serv_sock, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(struct timeval)); struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); serv_addr.sin_port = htons(atoi(getenv("FUZZ_PROXY_PORT"))); int reuse = 1; setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)); bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); listen(serv_sock, 20); struct sockaddr_in client_addr; socklen_t client_addr_size = sizeof(client_addr); // INIT HTTP CLIENT pid_t fuzz_client = fork(); if (fuzz_client == 0) { fprintf(stdout, "%s", "start client\n"); //send request int sockfd; struct sockaddr_in servaddr; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 200000; sockfd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)); setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(struct timeval)); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servaddr.sin_port = htons(atoi(getenv("FUZZ_SERVER_PORT"))); connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); { char* buf = "GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:103.0) Gecko/20100101 Firefox/103.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.5\r\nAccept-Encoding: gzip, deflate, br\r\n\r\n"; write(sockfd, buf, strlen(buf)); } //receive response { char buf[80] = {0}; int n = read(sockfd, buf, sizeof(buf)); if (n < 1) { fprintf(stdout, "%s", "**Client timeout**\n"); } } close(sockfd); fprintf(stdout, "%s", "finish client\n"); _exit(0); } else { fprintf(stdout, "%s", "start server\n"); int client_sock = accept(serv_sock, (struct sockaddr*)&client_addr, &client_addr_size); { char buf[1024] = {0}; read(client_sock, buf, sizeof(buf)); } { char buf[102400] = {0}; FILE *f = fopen(getenv("FUZZ_INPUT_FILE"), "rb"); int n = fread(buf, 1, 102400, f); fclose(f); write(client_sock, buf, n); } fprintf(stdout, "%s", "server waits for client\n"); waitpid(fuzz_client, 0, 0); close(client_sock); close(serv_sock); fprintf(stdout, "%s", "finish server\n"); _exit(0); } } pid_t fuzz_child = waitpid(fuzz_server, 0, 0); //WNOHANG); printf("time to die: %d\n", fuzz_child); _exit(0); }