1diff -Nur httpd/compile_and_install.sh httpd.new/compile_and_install.sh 2--- httpd/compile_and_install.sh 1970-01-01 01:00:00.000000000 +0100 3+++ httpd.new/compile_and_install.sh 2017-11-02 23:48:05.049844778 +0100 4@@ -0,0 +1,62 @@ 5+#!/bin/sh 6+ 7+set -ex 8+ 9+# Directory with honggfuzz installation 10+HFUZZ_DIR="/home/jagger/src/honggfuzz" 11+# Change this to a directory where apache should be installed into 12+INSTALL_PREFIX="$(realpath "$PWD/../dist")" 13+NGHTTP2_VER=1.29.0 14+APR_VER=1.6.3 15+APR_UTIL_VER=1.6.1 16+CFLAGS_SAN="-fsanitize=address" 17+# Another viable option: few 18+APACHE_MODULES=most 19+ 20+NGHTTP2_PATH="$(realpath "$PWD/../nghttp2-$NGHTTP2_VER")/" 21+APR_PATH="$(realpath "$PWD/../apr-$APR_VER")" 22+APR_UTIL_PATH="$(realpath "$PWD/../apr-util-$APR_UTIL_VER")/" 23+ 24+export CC="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang" 25+export CXX="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang++" 26+ 27+echo "Compiling APR" 28+cd "$APR_PATH" 29+CFLAGS="$CFLAGS_SAN" ./configure --disable-shared --enable-static 30+make clean 31+make -j$(nproc) 32+cd - 33+ 34+echo "Compiling APR-UTIL" 35+cd "$APR_UTIL_PATH" 36+CFLAGS="$CFLAGS_SAN" ./configure --with-apr="$APR_PATH" --disable-shared --enable-static 37+make clean 38+make -j$(nproc) 39+cd - 40+ 41+echo "Compiling NGHTTP2" 42+cd "$NGHTTP2_PATH" 43+CFLAGS="$CFLAGS_SAN" CXXFLAGS="$CFLAGS_SAN" ./configure --disable-shared --enable-static 44+make clean 45+make -j$(nproc) 46+cd - 47+ 48+echo "Install PATH: $INSTALL_PREFIX" 49+./buildconf --with-apr="$APR_PATH" --with-apr-util="$APR_UTIL_PATH" 50+ 51+echo "Compiling HTTPD" 52+CC="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang" CXX="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang++" CFLAGS="-I$NGHTTP2_PATH/lib/includes $CFLAGS_SAN -ggdb -O3" LDFLAGS="-L$NGHTTP2_PATH/lib -lpthread" \ 53+./configure \ 54+ --prefix="$INSTALL_PREFIX" \ 55+ --with-nghttp2="$NGHTTP2_PATH/" \ 56+ --enable-http2 \ 57+ --enable-nghttp2-staticlib-deps \ 58+ --with-mpm=event \ 59+ --enable-unixd \ 60+ --disable-pie \ 61+ --enable-mods-static=$APACHE_MODULES \ 62+ --with-apr="$APR_PATH" \ 63+ --with-apr-util="$APR_UTIL_PATH" 64+make clean 65+make -j$(nproc) 66+make install 67diff -Nur httpd/configure.in httpd.new/configure.in 68--- httpd/configure.in 2017-11-02 23:48:27.717470876 +0100 69+++ httpd.new/configure.in 2017-11-02 23:48:05.053844712 +0100 70@@ -721,7 +721,7 @@ 71 if test "x$PKGCONFIG" != "x" && `$PKGCONFIG --atleast-version='0.9.12' check`; then 72 UNITTEST_CFLAGS=`$PKGCONFIG --cflags check` 73 UNITTEST_LIBS=`$PKGCONFIG --libs check` 74- other_targets="$other_targets test/httpdunit" 75+ other_targets="$other_targets" 76 77 AC_MSG_RESULT([yes]) 78 else 79diff -Nur httpd/server/main.c httpd.new/server/main.c 80--- httpd/server/main.c 2017-11-02 23:48:27.913467639 +0100 81+++ httpd.new/server/main.c 2017-11-02 23:48:05.053844712 +0100 82@@ -484,8 +484,84 @@ 83 destroy_and_exit_process(process, 1); 84 } 85 86-int main(int argc, const char * const argv[]) 87-{ 88+#include <libhfuzz/libhfuzz.h> 89+ 90+static void GETDATA(void *unused) { 91+ usleep(100000); 92+ 93+ for (;;) { 94+ size_t len; 95+ const uint8_t *buf; 96+ 97+ HF_ITER(&buf, &len); 98+ 99+ int myfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); 100+ if (myfd == -1) { 101+ perror("socket"); 102+ _exit(1); 103+ } 104+ 105+ int sz = (1024 * 1024); 106+ if (setsockopt(myfd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz)) == -1) { 107+ perror("setsockopt"); 108+ exit(1); 109+ } 110+ 111+ struct sockaddr_in saddr; 112+ saddr.sin_family = AF_INET; 113+ saddr.sin_port = htons(8080); 114+ saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 115+ if (connect(myfd, &saddr, sizeof(saddr)) == -1) { 116+ perror("connect"); 117+ close(myfd); 118+ continue; 119+ } 120+ 121+ if (send(myfd, buf, len, MSG_NOSIGNAL) != len) { 122+ perror("send() failed 1"); 123+ exit(1); 124+ } 125+ 126+ if (shutdown(myfd, SHUT_WR) == -1) { 127+ perror("shutdown"); 128+ exit(1); 129+ } 130+ 131+ char b[1024 * 1024]; 132+ while (recv(myfd, b, sizeof(b), MSG_WAITALL) > 0) {} ; 133+ 134+ close(myfd); 135+ } 136+} 137+ 138+static void LAUNCHTHR() { 139+ if (linuxEnterNs(CLONE_NEWUSER|CLONE_NEWNET|CLONE_NEWNS|CLONE_NEWIPC|CLONE_NEWUTS) == false) { 140+ exit(1); 141+ } 142+ if (linuxIfaceUp("lo") == false) { 143+ exit(1); 144+ } 145+ if (linuxMountTmpfs("/tmp") == false) { 146+ exit(1); 147+ } 148+ 149+ pthread_t t; 150+ pthread_attr_t attr; 151+ 152+ pthread_attr_init(&attr); 153+ pthread_attr_setstacksize(&attr, 1024 * 1024 * 8); 154+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 155+ 156+ pthread_create(&t, &attr, GETDATA, NULL); 157+} 158+ 159+ int main(int argc, const char * const argv[]) 160+ { 161+ 162+ if (getenv("NO_FUZZ") == NULL) { 163+ LAUNCHTHR(); 164+ } 165+ 166 char c; 167 int showcompile = 0, showdirectives = 0; 168 const char *confname = SERVER_CONFIG_FILE; 169