| Age | Commit message (Collapse) | Author |
|
Update VERSION define to 0.9.1 in ychat/src/build.h, yhttpd/src/msgs.h,
and ycurses/src/msgs.h. Also bump the 'Version 0.9.0-CURRENT' file-header
comments across ychat/src to 0.9.1-CURRENT, and the README example log
line.
|
|
Align all three subprojects on 0.9.0 (ychat was already 0.9.0):
- yhttpd src/msgs.h: VERSION 0.8 -> 0.9.0 (BRANCH stays CURRENT, BUILDNR
unchanged at 4027).
- yhttpd VERSION file: 0.8.3-CURRENT Build 4003 -> 0.9.0-CURRENT Build 4027,
reconciled with the msgs.h macros (the file and macro previously
disagreed on both the version string and the build number).
- ycurses src/msgs.h: VERSION 0.1 -> 0.9.0.
ychat src/build.h is unchanged (already 0.9.0-CURRENT, BUILDNR 4325).
|
|
Two residual stability bugs in yhttpd's own sock.cpp (ychat never had
them -- yhttpd's read_http request parser is structurally different
from ychat's), found while auditing for ychat engine-fix backports:
1. sock::read_http malformed Content-Length crash (a3908e1-class).
read_http matched the header on the 15-char prefix "Content-Length:"
(no space required) but then assumed the canonical
"Content-Length: <value>" form and substr'd from index 16. Two
reachable crash cases for any unauthenticated client:
- bare "Content-Length:" (15 chars): substr(16, len-16) had
pos > size -> std::out_of_range throw -> uncaught -> process crash.
- "Content-Length:\n" (16 chars, no value): the substring was
empty so the do/while digit scan read past the buffer (OOB read)
until a stray '\n' in adjacent memory.
Now guarded: require the space separator + a value before substr,
and bound the scan to the substring length. Verified in Docker:
both malformed cases close gracefully, a valid Content-Length: 0
POST still returns 200, server stays up.
2. sock::start unchecked accept(). The accept() return was used
unchecked; on failure (fd == -1, e.g. EMFILE/ENFILE under fd
exhaustion, EINTR) FD_SET(-1, &active_fd_set) is UB (bit-op on a
negative index) and the later _create_container(-1) would
read/write fd -1 (EBADF). Now bails with ACCPERR and continues on
any accept error (the accept-bail half of ychat's 1c36abe, which
the original yhttpd port only carried the size_t->socklen_t init of).
yhttpd is not deployed to the cluster (no Helm chart/ArgoCD app); this
is a build-and-verify-in-Docker project, so no deploy step. ycurses
shares no socket/template engine with ychat (it is a standalone curses
library demo) so nothing applies there.
|
|
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>
|
|
|