diff --git a/afl.sh b/afl.sh deleted file mode 100755 index b486422..0000000 --- a/afl.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -ex - -cd $(dirname $0) - -make afl -afl-fuzz -i afl_state/testcases -o afl_state/findings -- ./fastcgi_conn_afl diff --git a/afl_state/testcases/022037fbc06e85dad6715825e87f12f9d5225c5d261d2c57dd85d319f7e7ef5b b/afl_state/testcases/022037fbc06e85dad6715825e87f12f9d5225c5d261d2c57dd85d319f7e7ef5b deleted file mode 100644 index bd7a9d3..0000000 Binary files a/afl_state/testcases/022037fbc06e85dad6715825e87f12f9d5225c5d261d2c57dd85d319f7e7ef5b and /dev/null differ diff --git a/afl_state/testcases/111e5d01a64d5ecb6242b18b435776eb0732660dd0a07fdef48764beacb67a99 b/afl_state/testcases/111e5d01a64d5ecb6242b18b435776eb0732660dd0a07fdef48764beacb67a99 deleted file mode 100644 index 574b774..0000000 Binary files a/afl_state/testcases/111e5d01a64d5ecb6242b18b435776eb0732660dd0a07fdef48764beacb67a99 and /dev/null differ diff --git a/afl_state/testcases/121ca696c06f2954a5ea890175b1b0d77d13d2b3cc68a79121d9f2644b78d099 b/afl_state/testcases/121ca696c06f2954a5ea890175b1b0d77d13d2b3cc68a79121d9f2644b78d099 deleted file mode 100644 index 406e081..0000000 Binary files a/afl_state/testcases/121ca696c06f2954a5ea890175b1b0d77d13d2b3cc68a79121d9f2644b78d099 and /dev/null differ diff --git a/afl_state/testcases/185e3888af879ceaa1b5b14389df7b72ace63e83f25640bbee8425e15dd0cde3 b/afl_state/testcases/185e3888af879ceaa1b5b14389df7b72ace63e83f25640bbee8425e15dd0cde3 deleted file mode 100644 index 02cd8fa..0000000 Binary files a/afl_state/testcases/185e3888af879ceaa1b5b14389df7b72ace63e83f25640bbee8425e15dd0cde3 and /dev/null differ diff --git a/afl_state/testcases/1928aa764353c6adb9ec81c20f35261a9e43fbdf4238b57064f0b47c3f28110e b/afl_state/testcases/1928aa764353c6adb9ec81c20f35261a9e43fbdf4238b57064f0b47c3f28110e deleted file mode 100644 index e2c2793..0000000 Binary files a/afl_state/testcases/1928aa764353c6adb9ec81c20f35261a9e43fbdf4238b57064f0b47c3f28110e and /dev/null differ diff --git a/afl_state/testcases/1ad846ec633f6d5463263b0059ad04875ee66b2abebf489a7feda6cd3d6fe051 b/afl_state/testcases/1ad846ec633f6d5463263b0059ad04875ee66b2abebf489a7feda6cd3d6fe051 deleted file mode 100644 index 91e8aae..0000000 Binary files a/afl_state/testcases/1ad846ec633f6d5463263b0059ad04875ee66b2abebf489a7feda6cd3d6fe051 and /dev/null differ diff --git a/afl_state/testcases/1d49ab3935007821bbd09a9fe51cc844e174d86e37d87903530754e1f14ecb45 b/afl_state/testcases/1d49ab3935007821bbd09a9fe51cc844e174d86e37d87903530754e1f14ecb45 deleted file mode 100644 index ee84c9b..0000000 Binary files a/afl_state/testcases/1d49ab3935007821bbd09a9fe51cc844e174d86e37d87903530754e1f14ecb45 and /dev/null differ diff --git a/afl_state/testcases/2371f72e7af92774396c6b171cab81359608b47e06b07d52ea353eada90a3b2e b/afl_state/testcases/2371f72e7af92774396c6b171cab81359608b47e06b07d52ea353eada90a3b2e deleted file mode 100644 index 8842abb..0000000 Binary files a/afl_state/testcases/2371f72e7af92774396c6b171cab81359608b47e06b07d52ea353eada90a3b2e and /dev/null differ diff --git a/afl_state/testcases/28e517f07b8c9cfbd8516fec9c7e7b40c6e8812d08926d18c79485f59fab348a b/afl_state/testcases/28e517f07b8c9cfbd8516fec9c7e7b40c6e8812d08926d18c79485f59fab348a deleted file mode 100644 index 1769f8b..0000000 Binary files a/afl_state/testcases/28e517f07b8c9cfbd8516fec9c7e7b40c6e8812d08926d18c79485f59fab348a and /dev/null differ diff --git a/afl_state/testcases/30ed1395d21b4800441056effeeba6be045e5dc5b9f548ba206341f3dfb331ce b/afl_state/testcases/30ed1395d21b4800441056effeeba6be045e5dc5b9f548ba206341f3dfb331ce deleted file mode 100644 index 20210f7..0000000 Binary files a/afl_state/testcases/30ed1395d21b4800441056effeeba6be045e5dc5b9f548ba206341f3dfb331ce and /dev/null differ diff --git a/afl_state/testcases/4e4c2fc640cd44474724dc09d574063838b15bfa3b4c1cf2cbd57b762a5385bb b/afl_state/testcases/4e4c2fc640cd44474724dc09d574063838b15bfa3b4c1cf2cbd57b762a5385bb deleted file mode 100644 index 6819097..0000000 Binary files a/afl_state/testcases/4e4c2fc640cd44474724dc09d574063838b15bfa3b4c1cf2cbd57b762a5385bb and /dev/null differ diff --git a/afl_state/testcases/5a475f3e29d831c020160ed9e9fcf06c5715c33abbeddb9f1125b9b519b78b70 b/afl_state/testcases/5a475f3e29d831c020160ed9e9fcf06c5715c33abbeddb9f1125b9b519b78b70 deleted file mode 100644 index c0fffd2..0000000 Binary files a/afl_state/testcases/5a475f3e29d831c020160ed9e9fcf06c5715c33abbeddb9f1125b9b519b78b70 and /dev/null differ diff --git a/afl_state/testcases/5be2228ef8f078cd0513dbb44f64fb2db8405c1404b9d5d57c28cdc9f837a095 b/afl_state/testcases/5be2228ef8f078cd0513dbb44f64fb2db8405c1404b9d5d57c28cdc9f837a095 deleted file mode 100644 index e934f88..0000000 Binary files a/afl_state/testcases/5be2228ef8f078cd0513dbb44f64fb2db8405c1404b9d5d57c28cdc9f837a095 and /dev/null differ diff --git a/afl_state/testcases/5d1ae4ffcce1e8adf38af8ab0f13cd9eaee2f192f7abd23a669b8dcecf67fed8 b/afl_state/testcases/5d1ae4ffcce1e8adf38af8ab0f13cd9eaee2f192f7abd23a669b8dcecf67fed8 deleted file mode 100644 index 8353483..0000000 Binary files a/afl_state/testcases/5d1ae4ffcce1e8adf38af8ab0f13cd9eaee2f192f7abd23a669b8dcecf67fed8 and /dev/null differ diff --git a/afl_state/testcases/69c9b3ea606d4f2cab4f947c56aaf687dcaa03e787480cf08d3e294c7adb789e b/afl_state/testcases/69c9b3ea606d4f2cab4f947c56aaf687dcaa03e787480cf08d3e294c7adb789e deleted file mode 100644 index 78f2c49..0000000 Binary files a/afl_state/testcases/69c9b3ea606d4f2cab4f947c56aaf687dcaa03e787480cf08d3e294c7adb789e and /dev/null differ diff --git a/afl_state/testcases/6d0fd877b23fbda56ba5c9642064c60d7b836cf51b25e3e63ebc15c4040df0fd b/afl_state/testcases/6d0fd877b23fbda56ba5c9642064c60d7b836cf51b25e3e63ebc15c4040df0fd deleted file mode 100644 index bb252d2..0000000 Binary files a/afl_state/testcases/6d0fd877b23fbda56ba5c9642064c60d7b836cf51b25e3e63ebc15c4040df0fd and /dev/null differ diff --git a/afl_state/testcases/70e75d905651c89bdb007261c044a67531aa45cf98e3a4d9cfa70613e95aaa88 b/afl_state/testcases/70e75d905651c89bdb007261c044a67531aa45cf98e3a4d9cfa70613e95aaa88 deleted file mode 100644 index 17f5084..0000000 Binary files a/afl_state/testcases/70e75d905651c89bdb007261c044a67531aa45cf98e3a4d9cfa70613e95aaa88 and /dev/null differ diff --git a/afl_state/testcases/71ccd45d0579bcca593a5d38986d2b44195b7a34990a5f3af26a51d02c0dd2e3 b/afl_state/testcases/71ccd45d0579bcca593a5d38986d2b44195b7a34990a5f3af26a51d02c0dd2e3 deleted file mode 100644 index be69bc4..0000000 Binary files a/afl_state/testcases/71ccd45d0579bcca593a5d38986d2b44195b7a34990a5f3af26a51d02c0dd2e3 and /dev/null differ diff --git a/afl_state/testcases/737fa988d1dce8d841ef209a496ca36f3678ce5a10eea1c22841ba47e0e67d93 b/afl_state/testcases/737fa988d1dce8d841ef209a496ca36f3678ce5a10eea1c22841ba47e0e67d93 deleted file mode 100644 index 65c353a..0000000 Binary files a/afl_state/testcases/737fa988d1dce8d841ef209a496ca36f3678ce5a10eea1c22841ba47e0e67d93 and /dev/null differ diff --git a/afl_state/testcases/75e5befe1b1bbd6cc4d56c514d7ed7018c6771337de049a6e18afb4e964206cc b/afl_state/testcases/75e5befe1b1bbd6cc4d56c514d7ed7018c6771337de049a6e18afb4e964206cc deleted file mode 100644 index 4b92cfb..0000000 Binary files a/afl_state/testcases/75e5befe1b1bbd6cc4d56c514d7ed7018c6771337de049a6e18afb4e964206cc and /dev/null differ diff --git a/afl_state/testcases/768986e1087fe968f65838001cf40ae0649be9dfd3b67eaaa88251fd6a3e8375 b/afl_state/testcases/768986e1087fe968f65838001cf40ae0649be9dfd3b67eaaa88251fd6a3e8375 deleted file mode 100644 index 923e933..0000000 Binary files a/afl_state/testcases/768986e1087fe968f65838001cf40ae0649be9dfd3b67eaaa88251fd6a3e8375 and /dev/null differ diff --git a/afl_state/testcases/76a3c32566a2963938d9e8c09747cffa65b988e67812abac5a9da9684000a37a b/afl_state/testcases/76a3c32566a2963938d9e8c09747cffa65b988e67812abac5a9da9684000a37a deleted file mode 100644 index 3cd488d..0000000 Binary files a/afl_state/testcases/76a3c32566a2963938d9e8c09747cffa65b988e67812abac5a9da9684000a37a and /dev/null differ diff --git a/afl_state/testcases/7e9901365d69d3c41ad48093209d4af8c282a3178901846758fdaf032541ae35 b/afl_state/testcases/7e9901365d69d3c41ad48093209d4af8c282a3178901846758fdaf032541ae35 deleted file mode 100644 index 8917595..0000000 Binary files a/afl_state/testcases/7e9901365d69d3c41ad48093209d4af8c282a3178901846758fdaf032541ae35 and /dev/null differ diff --git a/afl_state/testcases/80ab510b2c1fb6ce80cc76a9f2669918900a42373b17d0451013ab015aebc11a b/afl_state/testcases/80ab510b2c1fb6ce80cc76a9f2669918900a42373b17d0451013ab015aebc11a deleted file mode 100644 index 5e92dba..0000000 Binary files a/afl_state/testcases/80ab510b2c1fb6ce80cc76a9f2669918900a42373b17d0451013ab015aebc11a and /dev/null differ diff --git a/afl_state/testcases/829582023a0aa4c3d474ca11d8cfc290c9a079b52742662bf9ecbc0d2b4ba839 b/afl_state/testcases/829582023a0aa4c3d474ca11d8cfc290c9a079b52742662bf9ecbc0d2b4ba839 deleted file mode 100644 index 3ce56f9..0000000 Binary files a/afl_state/testcases/829582023a0aa4c3d474ca11d8cfc290c9a079b52742662bf9ecbc0d2b4ba839 and /dev/null differ diff --git a/afl_state/testcases/83c64007b09298194d5a7ceea75fdd9e570e9a147476478a0baec24a51fc061c b/afl_state/testcases/83c64007b09298194d5a7ceea75fdd9e570e9a147476478a0baec24a51fc061c deleted file mode 100644 index 6573cc7..0000000 Binary files a/afl_state/testcases/83c64007b09298194d5a7ceea75fdd9e570e9a147476478a0baec24a51fc061c and /dev/null differ diff --git a/afl_state/testcases/8a7b5bfa45d3288150d3b42244d03a274bc169ca16dc1b230ccf045051fcb09c b/afl_state/testcases/8a7b5bfa45d3288150d3b42244d03a274bc169ca16dc1b230ccf045051fcb09c deleted file mode 100644 index 1964562..0000000 Binary files a/afl_state/testcases/8a7b5bfa45d3288150d3b42244d03a274bc169ca16dc1b230ccf045051fcb09c and /dev/null differ diff --git a/afl_state/testcases/949ab2c9cced1ab2e59dac76dae7f3e5eeb92dcb7bda201b590b97c29f70d04d b/afl_state/testcases/949ab2c9cced1ab2e59dac76dae7f3e5eeb92dcb7bda201b590b97c29f70d04d deleted file mode 100644 index 8f66d2c..0000000 Binary files a/afl_state/testcases/949ab2c9cced1ab2e59dac76dae7f3e5eeb92dcb7bda201b590b97c29f70d04d and /dev/null differ diff --git a/afl_state/testcases/af1d054aa382592fd3606fe219463d3bc1bd43843d97e87bf44cf7c0698aba4d b/afl_state/testcases/af1d054aa382592fd3606fe219463d3bc1bd43843d97e87bf44cf7c0698aba4d deleted file mode 100644 index 0864eea..0000000 Binary files a/afl_state/testcases/af1d054aa382592fd3606fe219463d3bc1bd43843d97e87bf44cf7c0698aba4d and /dev/null differ diff --git a/afl_state/testcases/b18d3ff06e0803083dde3803e295f669ea2061260df472f66e1cf8a2f93f9963 b/afl_state/testcases/b18d3ff06e0803083dde3803e295f669ea2061260df472f66e1cf8a2f93f9963 deleted file mode 100644 index d8e6355..0000000 Binary files a/afl_state/testcases/b18d3ff06e0803083dde3803e295f669ea2061260df472f66e1cf8a2f93f9963 and /dev/null differ diff --git a/afl_state/testcases/b280e6a891120e9dd57a749dca0e49d85dd4c5ce27ac8b6d4467f2cacb6842cc b/afl_state/testcases/b280e6a891120e9dd57a749dca0e49d85dd4c5ce27ac8b6d4467f2cacb6842cc deleted file mode 100644 index 3e9213e..0000000 Binary files a/afl_state/testcases/b280e6a891120e9dd57a749dca0e49d85dd4c5ce27ac8b6d4467f2cacb6842cc and /dev/null differ diff --git a/afl_state/testcases/b43a8f29662ce030264860be29692b866a73ab61ace36b2fba1deb63f5e834e6 b/afl_state/testcases/b43a8f29662ce030264860be29692b866a73ab61ace36b2fba1deb63f5e834e6 deleted file mode 100644 index f4e6095..0000000 Binary files a/afl_state/testcases/b43a8f29662ce030264860be29692b866a73ab61ace36b2fba1deb63f5e834e6 and /dev/null differ diff --git a/afl_state/testcases/bbab38731506afc10241edbdfa2d621e824e788e6801fccb6c94c9221e7555fc b/afl_state/testcases/bbab38731506afc10241edbdfa2d621e824e788e6801fccb6c94c9221e7555fc deleted file mode 100644 index 9033570..0000000 Binary files a/afl_state/testcases/bbab38731506afc10241edbdfa2d621e824e788e6801fccb6c94c9221e7555fc and /dev/null differ diff --git a/afl_state/testcases/bbc1d2e91dad4aa0b30028e2dadf957e12cc5772e19a39e8cb8cc7fd51715fab b/afl_state/testcases/bbc1d2e91dad4aa0b30028e2dadf957e12cc5772e19a39e8cb8cc7fd51715fab deleted file mode 100644 index 84ea21b..0000000 Binary files a/afl_state/testcases/bbc1d2e91dad4aa0b30028e2dadf957e12cc5772e19a39e8cb8cc7fd51715fab and /dev/null differ diff --git a/afl_state/testcases/cb068972ae29231ee8994f78f1f5267b00201c60e4ea05dca190a2bf208ec84b b/afl_state/testcases/cb068972ae29231ee8994f78f1f5267b00201c60e4ea05dca190a2bf208ec84b deleted file mode 100644 index e0bdbd3..0000000 Binary files a/afl_state/testcases/cb068972ae29231ee8994f78f1f5267b00201c60e4ea05dca190a2bf208ec84b and /dev/null differ diff --git a/afl_state/testcases/cee40462df109c1240452a8b21152a20a64b3d4823bc5cba214a9ab0e9bd7c91 b/afl_state/testcases/cee40462df109c1240452a8b21152a20a64b3d4823bc5cba214a9ab0e9bd7c91 deleted file mode 100644 index 59e5208..0000000 Binary files a/afl_state/testcases/cee40462df109c1240452a8b21152a20a64b3d4823bc5cba214a9ab0e9bd7c91 and /dev/null differ diff --git a/afl_state/testcases/d053a13665e280669feba52b058540fef909f305b84188d8b8ff7fa2a4a2f046 b/afl_state/testcases/d053a13665e280669feba52b058540fef909f305b84188d8b8ff7fa2a4a2f046 deleted file mode 100644 index 392cfdd..0000000 Binary files a/afl_state/testcases/d053a13665e280669feba52b058540fef909f305b84188d8b8ff7fa2a4a2f046 and /dev/null differ diff --git a/afl_state/testcases/d9b54a10c72c8d8403e7b7e5ec76b5595d135f68cfc2d9f1e84931374cc2683e b/afl_state/testcases/d9b54a10c72c8d8403e7b7e5ec76b5595d135f68cfc2d9f1e84931374cc2683e deleted file mode 100644 index 305e737..0000000 Binary files a/afl_state/testcases/d9b54a10c72c8d8403e7b7e5ec76b5595d135f68cfc2d9f1e84931374cc2683e and /dev/null differ diff --git a/afl_state/testcases/dbd16092ab38e71d15db1a746254aeb71939d68e80d34e6453e9b79117001bb8 b/afl_state/testcases/dbd16092ab38e71d15db1a746254aeb71939d68e80d34e6453e9b79117001bb8 deleted file mode 100644 index c3ced6f..0000000 Binary files a/afl_state/testcases/dbd16092ab38e71d15db1a746254aeb71939d68e80d34e6453e9b79117001bb8 and /dev/null differ diff --git a/afl_state/testcases/e6e02a365f3d7d6cee919d0e3477dbe2da02981ebf1df321b185b4c81594fc30 b/afl_state/testcases/e6e02a365f3d7d6cee919d0e3477dbe2da02981ebf1df321b185b4c81594fc30 deleted file mode 100644 index 0a90e28..0000000 Binary files a/afl_state/testcases/e6e02a365f3d7d6cee919d0e3477dbe2da02981ebf1df321b185b4c81594fc30 and /dev/null differ diff --git a/afl_state/testcases/f0bd75e23d5310b0a749bcd38995054df14892f592a548590779323628d97ee7 b/afl_state/testcases/f0bd75e23d5310b0a749bcd38995054df14892f592a548590779323628d97ee7 deleted file mode 100644 index a9a2791..0000000 Binary files a/afl_state/testcases/f0bd75e23d5310b0a749bcd38995054df14892f592a548590779323628d97ee7 and /dev/null differ diff --git a/afl_state/testcases/f4ab1cb7fb2de87e60d33e0c30cd6d00e46894b530886f855a9ff77b3b4e9f28 b/afl_state/testcases/f4ab1cb7fb2de87e60d33e0c30cd6d00e46894b530886f855a9ff77b3b4e9f28 deleted file mode 100644 index 6536433..0000000 Binary files a/afl_state/testcases/f4ab1cb7fb2de87e60d33e0c30cd6d00e46894b530886f855a9ff77b3b4e9f28 and /dev/null differ diff --git a/afl_state/testcases/fb89ee72a9399c6bec2ff246d350462a8eb603cdb8ff607afc632ac722fe860c b/afl_state/testcases/fb89ee72a9399c6bec2ff246d350462a8eb603cdb8ff607afc632ac722fe860c deleted file mode 100644 index dad71ba..0000000 Binary files a/afl_state/testcases/fb89ee72a9399c6bec2ff246d350462a8eb603cdb8ff607afc632ac722fe860c and /dev/null differ diff --git a/buffer.cc b/buffer.cc deleted file mode 100644 index 69d8e41..0000000 --- a/buffer.cc +++ /dev/null @@ -1,79 +0,0 @@ -#include "buffer.h" - -ConstBuffer::ConstBuffer(const char *buf, size_t len) - : const_buf_(buf), - len_(len) {} - -size_t ConstBuffer::ReadMaxLen() const { - return len_ - start_; -} - -const char *ConstBuffer::Read(size_t len) { - if (ReadMaxLen() < len) { - return nullptr; - } - const auto *ret = &const_buf_[start_]; - start_ += len; - return ret; -} - -bool ConstBuffer::Discard(size_t len) { - if (len > ReadMaxLen()) { - return false; - } - static_cast(Read(len)); - return true; -} - -void ConstBuffer::ResetRead() { - start_ = commit_; -} - -void ConstBuffer::Commit() { - commit_ = start_; -} - - -Buffer::Buffer(char *buf, size_t size, size_t len) - : ConstBuffer(buf, size), - buf_(buf), - size_(size) { - len_ = len; -} - -Buffer::Buffer(size_t size) - : Buffer(new char[size], size, 0) { - own_buf_.reset(buf_); -} - -char *Buffer::WritePtr() { - return &buf_[len_]; -} - -size_t Buffer::WriteMaxLen() const { - return size_ - len_; -} - -bool Buffer::Write(const std::string_view& str) { - if (WriteMaxLen() < str.size()) { - return false; - } - memcpy(WritePtr(), str.data(), str.size()); - Wrote(str.size()); - return true; -} - -void Buffer::Wrote(size_t len) { - CHECK_LE(len, WriteMaxLen()); - len_ += len; -} - -void Buffer::Consume() { - if (commit_ == 0) { - return; - } - memmove(buf_, &buf_[commit_], len_ - commit_); - len_ -= commit_; - start_ -= commit_; - commit_ = 0; -} diff --git a/buffer.h b/buffer.h deleted file mode 100644 index 1d11aa2..0000000 --- a/buffer.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include -#include -#include - -class ConstBuffer { - public: - ConstBuffer(const char *buf, size_t len); - - [[nodiscard]] size_t ReadMaxLen() const; - [[nodiscard]] virtual const char *Read(size_t len); - template [[nodiscard]] const T *ReadObj(); - - bool Discard(size_t len); // like Read() but don't use the result - void ResetRead(); // next read from last commit - void Commit(); // commit read position - - protected: - const char *const_buf_; - size_t len_; - size_t start_ = 0; - size_t commit_ = 0; -}; - -class Buffer : public ConstBuffer { - public: - Buffer(char *buf, size_t size, size_t len); - Buffer(size_t size); - - [[nodiscard]] char *WritePtr(); - [[nodiscard]] size_t WriteMaxLen() const; - bool Write(const std::string_view& str); - void Wrote(size_t len); - - void Consume(); // discard up to last commit - - protected: - std::unique_ptr own_buf_; - char *buf_; - const size_t size_; -}; - -template const T *ConstBuffer::ReadObj() { - if (ReadMaxLen() < sizeof(T)) { - return nullptr; - } - return reinterpret_cast(Read(sizeof(T))); -} diff --git a/example_simple.cc b/example_simple.cc deleted file mode 100644 index eac081b..0000000 --- a/example_simple.cc +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include - -#include "fastcgi.h" - -DEFINE_int32(port, 9000, "TCP port to bind"); -DEFINE_int32(threads, 1, "Number of server threads"); - -int main(int argc, char *argv[]) { - google::InitGoogleLogging(argv[0]); - gflags::ParseCommandLineFlags(&argc, &argv, true); - - FastCGIServer server(FLAGS_port, [](std::unique_ptr request) { - request->WriteHeader("Content-Type", "text/plain"); - request->WriteBody("Hello world"); - request->End(); - }, FLAGS_threads); - server.Serve(); -} diff --git a/fastcgi.cc b/fastcgi.cc deleted file mode 100644 index db33226..0000000 --- a/fastcgi.cc +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "fastcgi.h" -#include "fastcgi_conn.h" - -FastCGIServer::FastCGIServer(int port, const std::function)>& callback, int threads, const std::unordered_set& headers) - : port_(port), - callback_(callback), - threads_(threads), - headers_(headers) { - LOG(INFO) << "listening on [::1]:" << port_; - - signal(SIGPIPE, SIG_IGN); -} - -void FastCGIServer::Serve() { - std::vector threads; - for (int i = 0; i < threads_ - 1; ++i) { - threads.emplace_back([this]() { ServeInt(); }); - } - ServeInt(); -} - -void FastCGIServer::ServeInt() { - auto epoll_fd = epoll_create1(0); - PCHECK(epoll_fd >= 0) << "epoll_create()"; - - auto listen_sock = NewListenSock(); - - { - struct epoll_event ev{ - .events = EPOLLIN, - .data = { - .ptr = nullptr, - }, - }; - PCHECK(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_sock, &ev) == 0); - } - - while (true) { - constexpr auto max_events = 256; - struct epoll_event events[max_events]; - auto num_fd = epoll_wait(epoll_fd, events, max_events, -1); - if (num_fd == -1 && errno == EINTR) { - continue; - } - PCHECK(num_fd > 0) << "epoll_wait()"; - - for (auto i = 0; i < num_fd; ++i) { - if (events[i].data.ptr == nullptr) { - NewConn(listen_sock, epoll_fd); - } else { - auto conn = static_cast(events[i].data.ptr); - auto fd = conn->Read(); - if (fd != -1) { - PCHECK(epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd, nullptr) == 0); - delete conn; - } - } - } - } -} - -void FastCGIServer::NewConn(int listen_sock, int epoll_fd) { - sockaddr_in6 client_addr; - socklen_t client_addr_len = sizeof(client_addr); - - auto client_sock = accept(listen_sock, (sockaddr*) &client_addr, &client_addr_len); - PCHECK(client_sock >= 0) << "accept()"; - CHECK_EQ(client_addr.sin6_family, AF_INET6); - - int flags = 1; - PCHECK(setsockopt(client_sock, SOL_TCP, TCP_NODELAY, &flags, sizeof(flags)) == 0); - - { - auto *conn = new FastCGIConn(client_sock, client_addr, callback_, headers_); - struct epoll_event ev{ - .events = EPOLLIN, - .data = { - .ptr = conn, - }, - }; - PCHECK(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_sock, &ev) == 0); - } -} - -int FastCGIServer::NewListenSock() { - auto sock = socket(AF_INET6, SOCK_STREAM, 0); - PCHECK(sock >= 0) << "socket()"; - - { - int optval = 1; - PCHECK(setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) == 0); - } - - { - sockaddr_in6 bind_addr = { - .sin6_family = AF_INET6, - .sin6_port = htons(port_), - .sin6_addr = IN6ADDR_LOOPBACK_INIT, - }; - PCHECK(bind(sock, (sockaddr*) &bind_addr, sizeof(bind_addr)) == 0); - } - - PCHECK(listen(sock, 128) == 0); - return sock; -} diff --git a/fastcgi.h b/fastcgi.h deleted file mode 100644 index bba8699..0000000 --- a/fastcgi.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "fastcgi_request.h" - -class FastCGIServer { - public: - FastCGIServer(int port, const std::function)>& callback, int threads=1, const std::unordered_set& headers={}); - void Serve(); - - private: - void NewConn(int listen_sock, int epoll_fd); - int NewListenSock(); - void ServeInt(); - - const int port_; - const std::function)> callback_; - const int threads_; - const std::unordered_set headers_; -}; diff --git a/fastcgi_conn.cc b/fastcgi_conn.cc deleted file mode 100644 index 54fbccc..0000000 --- a/fastcgi_conn.cc +++ /dev/null @@ -1,143 +0,0 @@ -#include -#include -#include - -#include "fastcgi_conn.h" - -#include "fastcgi_parse.h" -#include "fastcgi_request.h" - -FastCGIConn::FastCGIConn(int sock, const sockaddr_in6& client_addr, const std::function)>& callback, const std::unordered_set& headers) - : sock_(sock), - callback_(callback), - headers_(headers), - buf_(sock, fastcgi_max_record_len) { - char client_addr_str[INET6_ADDRSTRLEN]; - PCHECK(inet_ntop(AF_INET6, &client_addr.sin6_addr, client_addr_str, sizeof(client_addr_str))); - - LOG(INFO) << "new connection: [" << client_addr_str << "]:" << ntohs(client_addr.sin6_port); -} - -FastCGIConn::~FastCGIConn() { - PCHECK(close(sock_) == 0); - LOG(INFO) << "connection closed (handled " << requests_ << " requests)"; -} - -bool FastCGIConn::Write(const std::vector& vecs) { - ssize_t total_size = 0; - for (const auto& vec : vecs) { - total_size += vec.iov_len; - } - return writev(sock_, vecs.data(), vecs.size()) == total_size; -} - -int FastCGIConn::Read() { - if (!buf_.Refill()) { - return sock_; - } - - while (true) { - buf_.ResetRead(); - - const auto *header = buf_.ReadObj(); - if (!header) { - break; - } - - if (header->version != 1) { - LOG(ERROR) << "invalid FastCGI protocol version: " << header->version; - return sock_; - } - - if (buf_.ReadMaxLen() < header->ContentLength()) { - break; - } - - switch (header->type) { - case 1: - { - if (header->ContentLength() != sizeof(FastCGIBeginRequest)) { - LOG(ERROR) << "FCGI_BeginRequestBody is the wrong length: " << header->ContentLength(); - return sock_; - } - - const auto *begin_request = CHECK_NOTNULL(buf_.ReadObj()); - - if (begin_request->Role() != 1) { - LOG(ERROR) << "unsupported FastCGI role: " << begin_request->Role(); - return sock_; - } - - request_.reset(new FastCGIRequest(header->RequestId(), this)); - } - break; - - case 4: - { - if (request_ == nullptr || header->RequestId() != request_->RequestId()) { - LOG(ERROR) << "out of order FCGI_PARAMS record, or client is multiplexing requests (which we don't support)"; - return sock_; - } - - ConstBuffer param_buf(buf_.Read(header->ContentLength()), header->ContentLength()); - while (param_buf.ReadMaxLen() > 0) { - const auto *param_header = param_buf.ReadObj(); - if (!param_header) { - LOG(ERROR) << "FCGI_PARAMS missing header"; - return sock_; - } - - const auto *key_buf = param_buf.Read(param_header->key_length); - if (!key_buf) { - LOG(ERROR) << "FCGI_PARAMS missing key"; - return sock_; - } - std::string_view key(key_buf, param_header->key_length); - - const auto *value_buf = param_buf.Read(param_header->value_length); - if (!value_buf) { - LOG(ERROR) << "FCGI_PARAMS missing value"; - return sock_; - } - std::string_view value(value_buf, param_header->value_length); - - if (headers_.find(key) != headers_.end()) { - request_->AddParam(key, value); - } - } - } - break; - - case 5: - { - if (request_ == nullptr || header->RequestId() != request_->RequestId()) { - LOG(ERROR) << "out of order FCGI_STDIN record, or client is multiplexing requests (which we don't support)"; - return sock_; - } - - if (header->ContentLength() == 0) { - // Magic signal for completed request (mirrors the HTTP/1.1 protocol) - requests_++; - callback_(std::move(request_)); - } else { - std::string_view in(buf_.Read(header->ContentLength()), header->ContentLength()); - request_->AddIn(in); - } - } - break; - - default: - LOG(ERROR) << "unknown record type: " << header->type; - return sock_; - } - - if (!buf_.Discard(header->padding_length)) { - break; - } - - buf_.Commit(); // we've acted on the bytes read so far - } - - buf_.Consume(); - return -1; -} diff --git a/fastcgi_conn.h b/fastcgi_conn.h deleted file mode 100644 index 3f0a964..0000000 --- a/fastcgi_conn.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "fastcgi_request.h" -#include "stream_buffer.h" - -class FastCGIConn { - public: - FastCGIConn(int sock, const sockaddr_in6& client_addr, const std::function)>& callback, const std::unordered_set& headers); - ~FastCGIConn(); - - [[nodiscard]] int Read(); - [[nodiscard]] bool Write(const std::vector& vecs); - - private: - const int sock_; - const std::function)>& callback_; - const std::unordered_set& headers_; - - uint64_t requests_ = 0; - - StreamBuffer buf_; - - std::unique_ptr request_; -}; diff --git a/fastcgi_conn_afl.cc b/fastcgi_conn_afl.cc deleted file mode 100644 index da8d4d6..0000000 --- a/fastcgi_conn_afl.cc +++ /dev/null @@ -1,18 +0,0 @@ -#include "fastcgi_conn.h" - -int main(int argc, char* argv[]) { - FLAGS_logtostderr = 1; - FLAGS_minloglevel = 3; - google::InitGoogleLogging(argv[0]); - gflags::ParseCommandLineFlags(&argc, &argv, true); - - { - FastCGIConn conn(STDIN_FILENO, {}, [](std::unique_ptr req) { req->End(); }, {}); - static_cast(conn.Read()); - } - - gflags::ShutDownCommandLineFlags(); - google::ShutdownGoogleLogging(); - - return 0; -} diff --git a/fastcgi_parse.cc b/fastcgi_parse.cc deleted file mode 100644 index 7964ccd..0000000 --- a/fastcgi_parse.cc +++ /dev/null @@ -1,7 +0,0 @@ -#include "fastcgi_parse.h" - -FastCGIHeader::FastCGIHeader(uint8_t type_in, uint16_t request_id, uint16_t content_length) - : type(type_in) { - SetRequestId(request_id); - SetContentLength(content_length); -} diff --git a/fastcgi_parse.h b/fastcgi_parse.h deleted file mode 100644 index 733a0d9..0000000 --- a/fastcgi_parse.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include - -struct FastCGIHeader { - FastCGIHeader(uint8_t type_in, uint16_t request_id, uint16_t content_length); - - uint8_t version = 1; - uint8_t type; - private: - uint16_t request_id_; // network byte order - uint16_t content_length_; // network byte order - public: - uint8_t padding_length = 0; - uint8_t reserved = 0; - - uint16_t RequestId() const { return ntohs(request_id_); } - uint16_t ContentLength() const { return ntohs(content_length_); } - - void SetRequestId(uint16_t request_id) { request_id_ = htons(request_id); } - void SetContentLength(uint16_t content_length) { content_length_ = htons(content_length); } -}; - -struct FastCGIBeginRequest { - private: - uint16_t role_; // network byte order - public: - uint8_t flags; - uint8_t reserved[5]; - - uint16_t Role() const { return ntohs(role_); } -}; - -struct FastCGIEndRequest { - uint32_t app_status = htonl(0); // network byte order - uint8_t protocol_status; - uint8_t reserved[3] = {}; -}; - -struct FastCGIParamHeader { - uint8_t key_length; - uint8_t value_length; -}; - -constexpr auto fastcgi_max_content_len = 65535; -constexpr auto fastcgi_max_padding_len = 255; -constexpr auto fastcgi_max_record_len = sizeof(FastCGIHeader) + fastcgi_max_content_len + fastcgi_max_padding_len; diff --git a/fastcgi_request.cc b/fastcgi_request.cc deleted file mode 100644 index 5dad645..0000000 --- a/fastcgi_request.cc +++ /dev/null @@ -1,107 +0,0 @@ -#include - -#include "fastcgi_request.h" - -#include "fastcgi_conn.h" - -namespace { - -template void AppendVec(const T& obj, std::vector* vec) { - vec->push_back(iovec{ - .iov_base = (void*)(&obj), - .iov_len = sizeof(obj), - }); -} - -} // namespace - -FastCGIRequest::FastCGIRequest(uint16_t request_id, FastCGIConn* conn) - : request_id_(request_id), - conn_(conn), - out_buf_(fastcgi_max_record_len) {} - -uint16_t FastCGIRequest::RequestId() { - return request_id_; -} - -void FastCGIRequest::AddParam(const std::string_view& key, const std::string_view& value) { - params_.try_emplace(std::string(key), std::string(value)); -} - -void FastCGIRequest::AddIn(const std::string_view& in) { - in_.append(in); -} - -const std::string& FastCGIRequest::GetParam(const std::string& key) { - auto iter = params_.find(key); - if (iter == params_.end()) { - static const std::string none; - return none; - } - return iter->second; -} - -void FastCGIRequest::WriteHeader(const std::string_view& name, const std::string_view& value) { - CHECK(!body_written_); - CHECK(out_buf_.Write(name)); - CHECK(out_buf_.Write(": ")); - CHECK(out_buf_.Write(value)); - CHECK(out_buf_.Write("\n")); -} - -void FastCGIRequest::WriteBody(const std::string_view& body) { - if (!body_written_) { - CHECK(out_buf_.Write("\n")); - body_written_ = true; - } - // TODO: make this able to span multiple packets - CHECK(out_buf_.Write(body)); -} - -bool FastCGIRequest::Flush() { - std::vector vecs; - - auto header = OutputHeader(); - AppendVec(header, &vecs); - - vecs.push_back(OutputVec()); - - if (!conn_->Write(vecs)) { - return false; - } - out_buf_.Commit(); - return true; -} - -bool FastCGIRequest::End() { - // Fully empty response not allowed - WriteBody(""); - - std::vector vecs; - - // Must be outside if block, so it lives through Write() below - auto output_header = OutputHeader(); - if (output_header.ContentLength()) { - AppendVec(output_header, &vecs); - vecs.push_back(OutputVec()); - } - - FastCGIEndRequest end; - FastCGIHeader end_header(3, request_id_, sizeof(end)); - AppendVec(end_header, &vecs); - AppendVec(end, &vecs); - - return conn_->Write(vecs); -} - -iovec FastCGIRequest::OutputVec() { - const auto output_len = out_buf_.ReadMaxLen(); - return iovec{ - .iov_base = (void *)(CHECK_NOTNULL(out_buf_.Read(output_len))), - .iov_len = output_len, - }; -} - -FastCGIHeader FastCGIRequest::OutputHeader() { - return FastCGIHeader(6, request_id_, out_buf_.ReadMaxLen()); -} diff --git a/fastcgi_request.h b/fastcgi_request.h deleted file mode 100644 index b1ee3f6..0000000 --- a/fastcgi_request.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include - -#include "buffer.h" -#include "fastcgi_parse.h" - -class FastCGIConn; - -class FastCGIRequest { - public: - FastCGIRequest(uint16_t request_id, FastCGIConn *conn); - - uint16_t RequestId(); - - void AddParam(const std::string_view& key, const std::string_view& value); - void AddIn(const std::string_view& in); - - const std::string& GetParam(const std::string& key); - - void WriteHeader(const std::string_view& name, const std::string_view& value); - void WriteBody(const std::string_view& body); - [[nodiscard]] bool Flush(); - bool End(); - - private: - FastCGIHeader OutputHeader(); - iovec OutputVec(); - - const uint16_t request_id_; - FastCGIConn *conn_; - - std::unordered_map params_; - std::string in_; - - Buffer out_buf_; - bool body_written_ = false; -}; diff --git a/stream_buffer.cc b/stream_buffer.cc deleted file mode 100644 index e02a4cb..0000000 --- a/stream_buffer.cc +++ /dev/null @@ -1,14 +0,0 @@ -#include "stream_buffer.h" - -StreamBuffer::StreamBuffer(int sock, size_t size) - : Buffer(size), - sock_(sock) {} - -bool StreamBuffer::Refill() { - auto read_len = read(sock_, WritePtr(), WriteMaxLen()); - if (read_len == 0) { - return false; - } - Wrote(read_len); - return true; -} diff --git a/stream_buffer.h b/stream_buffer.h deleted file mode 100644 index bcfc629..0000000 --- a/stream_buffer.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "buffer.h" - -class StreamBuffer : public Buffer { - public: - StreamBuffer(int sock, size_t size); - - [[nodiscard]] bool Refill(); - - private: - int sock_; -};