blob: 95928264cf58bf56cb6f90cc994b10a1f4b45c60 [file] [log] [blame]
diff -Nur httpd/compile_and_install.sh httpd.new/compile_and_install.sh
--- httpd/compile_and_install.sh 1970-01-01 01:00:00.000000000 +0100
+++ httpd.new/compile_and_install.sh 2017-11-02 23:48:05.049844778 +0100
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+set -ex
+
+# Directory with honggfuzz installation
+HFUZZ_DIR="/home/jagger/src/honggfuzz"
+# Change this to a directory where apache should be installed into
+INSTALL_PREFIX="$(realpath "$PWD/../dist")"
+NGHTTP2_VER=1.29.0
+APR_VER=1.6.3
+APR_UTIL_VER=1.6.1
+CFLAGS_SAN="-fsanitize=address"
+# Another viable option: few
+APACHE_MODULES=most
+
+NGHTTP2_PATH="$(realpath "$PWD/../nghttp2-$NGHTTP2_VER")/"
+APR_PATH="$(realpath "$PWD/../apr-$APR_VER")"
+APR_UTIL_PATH="$(realpath "$PWD/../apr-util-$APR_UTIL_VER")/"
+
+export CC="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang"
+export CXX="$HFUZZ_DIR/hfuzz_cc/hfuzz-clang++"
+
+echo "Compiling APR"
+cd "$APR_PATH"
+CFLAGS="$CFLAGS_SAN" ./configure --disable-shared --enable-static
+make clean
+make -j$(nproc)
+cd -
+
+echo "Compiling APR-UTIL"
+cd "$APR_UTIL_PATH"
+CFLAGS="$CFLAGS_SAN" ./configure --with-apr="$APR_PATH" --disable-shared --enable-static
+make clean
+make -j$(nproc)
+cd -
+
+echo "Compiling NGHTTP2"
+cd "$NGHTTP2_PATH"
+CFLAGS="$CFLAGS_SAN" CXXFLAGS="$CFLAGS_SAN" ./configure --disable-shared --enable-static
+make clean
+make -j$(nproc)
+cd -
+
+echo "Install PATH: $INSTALL_PREFIX"
+./buildconf --with-apr="$APR_PATH" --with-apr-util="$APR_UTIL_PATH"
+
+echo "Compiling HTTPD"
+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" \
+./configure \
+ --prefix="$INSTALL_PREFIX" \
+ --with-nghttp2="$NGHTTP2_PATH/" \
+ --enable-http2 \
+ --enable-nghttp2-staticlib-deps \
+ --with-mpm=event \
+ --enable-unixd \
+ --disable-pie \
+ --enable-mods-static=$APACHE_MODULES \
+ --with-apr="$APR_PATH" \
+ --with-apr-util="$APR_UTIL_PATH"
+make clean
+make -j$(nproc)
+make install
diff -Nur httpd/configure.in httpd.new/configure.in
--- httpd/configure.in 2017-11-02 23:48:27.717470876 +0100
+++ httpd.new/configure.in 2017-11-02 23:48:05.053844712 +0100
@@ -721,7 +721,7 @@
if test "x$PKGCONFIG" != "x" && `$PKGCONFIG --atleast-version='0.9.12' check`; then
UNITTEST_CFLAGS=`$PKGCONFIG --cflags check`
UNITTEST_LIBS=`$PKGCONFIG --libs check`
- other_targets="$other_targets test/httpdunit"
+ other_targets="$other_targets"
AC_MSG_RESULT([yes])
else
diff -Nur httpd/server/main.c httpd.new/server/main.c
--- httpd/server/main.c 2017-11-02 23:48:27.913467639 +0100
+++ httpd.new/server/main.c 2017-11-02 23:48:05.053844712 +0100
@@ -484,8 +484,84 @@
destroy_and_exit_process(process, 1);
}
-int main(int argc, const char * const argv[])
-{
+#include <libhfuzz/libhfuzz.h>
+
+static void GETDATA(void *unused) {
+ usleep(100000);
+
+ for (;;) {
+ size_t len;
+ const uint8_t *buf;
+
+ HF_ITER(&buf, &len);
+
+ int myfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
+ if (myfd == -1) {
+ perror("socket");
+ _exit(1);
+ }
+
+ int sz = (1024 * 1024);
+ if (setsockopt(myfd, SOL_SOCKET, SO_SNDBUF, &sz, sizeof(sz)) == -1) {
+ perror("setsockopt");
+ exit(1);
+ }
+
+ struct sockaddr_in saddr;
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = htons(8080);
+ saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ if (connect(myfd, &saddr, sizeof(saddr)) == -1) {
+ perror("connect");
+ close(myfd);
+ continue;
+ }
+
+ if (send(myfd, buf, len, MSG_NOSIGNAL) != len) {
+ perror("send() failed 1");
+ exit(1);
+ }
+
+ if (shutdown(myfd, SHUT_WR) == -1) {
+ perror("shutdown");
+ exit(1);
+ }
+
+ char b[1024 * 1024];
+ while (recv(myfd, b, sizeof(b), MSG_WAITALL) > 0) {} ;
+
+ close(myfd);
+ }
+}
+
+static void LAUNCHTHR() {
+ if (linuxEnterNs(CLONE_NEWUSER|CLONE_NEWNET|CLONE_NEWNS|CLONE_NEWIPC|CLONE_NEWUTS) == false) {
+ exit(1);
+ }
+ if (linuxIfaceUp("lo") == false) {
+ exit(1);
+ }
+ if (linuxMountTmpfs("/tmp") == false) {
+ exit(1);
+ }
+
+ pthread_t t;
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 1024 * 1024 * 8);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ pthread_create(&t, &attr, GETDATA, NULL);
+}
+
+ int main(int argc, const char * const argv[])
+ {
+
+ if (getenv("NO_FUZZ") == NULL) {
+ LAUNCHTHR();
+ }
+
char c;
int showcompile = 0, showdirectives = 0;
const char *confname = SERVER_CONFIG_FILE;