diff options
| author | Paul Buetow <paul@buetow.org> | 2026-07-02 00:53:24 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-07-02 00:53:24 +0300 |
| commit | 58602a28d2c92b603208f3e01c14c169d28cc7b0 (patch) | |
| tree | 502d2e187ea29f2cc840e22d299d752d59088a3c /yhttpd/src/glob.h | |
| parent | 6c3a65b577f002f3219d03498c66205434765179 (diff) | |
yhttpd: port ychat fixes, get it building + stable in Docker (task 9s0)
Ports the ychat revival fixes (unsigned/size_t npos truncation, ofstream
== NULL, tool::trim OOB, CGI popen -> execve, www.yChat.org links, g++
version gate, config.pl -I., NCURSES/CLI-disabled build) so yhttpd builds
on modern GCC in a Rocky Linux 9 container, plus yhttpd-specific fixes
found while verifying it under concurrent load:
- listen() backlog was hardcoded to 1; bumped to SOMAXCONN.
- sock::_close() closed sockets with unread request bytes still in the
kernel receive buffer (read_http() only reads the GET line), so Linux
sent an abortive RST instead of a FIN, racing the client's read of the
response ("connection reset by peer" even though it was delivered).
Fixed with a non-blocking, bounded drain before close() - confirmed via
tcpdump: RSTs on every response before, zero after, across 140+
requests / concurrent bursts of 20.
- Removed a duplicate _make_server_socket() call in start() (wrap.cpp's
init_wrapper() already makes it before start() runs) that leaked a fd
and would have double-initialized SSL if OPENSSL is ever enabled;
caught by fresh-context review, documented honestly in DOCKER.md.
- src/configure's dependency-checker predates 64-bit multilib distros
(only checked /usr/lib, never /usr/lib64) and was missing an ncur
move-aside entry for the NCURSES-disabled build.
Added Dockerfile/.dockerignore/DOCKER.md documenting the build, the fixes,
and the one known-but-unfixed landmine (a SIGILL heap corruption in
sock::_close that reproduces on newer host GCC/glibc but not in the
container - latent, not fixed).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Diffstat (limited to 'yhttpd/src/glob.h')
| -rw-r--r-- | yhttpd/src/glob.h | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/yhttpd/src/glob.h b/yhttpd/src/glob.h index a2c1334..2283f1e 100644 --- a/yhttpd/src/glob.h +++ b/yhttpd/src/glob.h @@ -24,7 +24,7 @@ /* - CONFIG - Should yhttpd get compiled with comand line interface support? */ -#define CLI +//#define CLI /* - CONFIG - What should be the name of the config file? @@ -70,7 +70,7 @@ /* - CONFIG - Should yhttpd get compiled with ncurses support? */ -#define NCURSES +//#define NCURSES /* - CONFIG - Please specify the maximum length of a HTTP post request. @@ -84,12 +84,20 @@ #define READBUF 2048 /* - CONFIG - - Please specify the maximum length of a line read from a socket + Please specify the maximum length of a line read from a socket or a file. ( config-file, html-template ) */ #define READSOCK 2048 /* - CONFIG - + Upper bound (bytes) on how much unread request data sock::_close() will + drain from a socket before giving up and closing anyway. Bounds the + non-blocking drain loop against a client that keeps streaming data after + we've half-closed the connection. +*/ +#define DRAINMAX 8192 + +/* - CONFIG - In which prefix should yhttpd be installed if typing gmake inst- all? */ @@ -175,7 +183,7 @@ using namespace std; -typedef int function( void *v_arg ); +typedef int mod_func_t( void *v_arg ); struct container { @@ -184,7 +192,7 @@ struct container struct dynmod { - function *the_func ; + mod_func_t *the_func ; void *the_module; }; |
