Parent epic: #254
Motivation
SolidSyslogUdpSender_Create validates its config and rejects NULL
Resolver / Datagram / Address / Endpoint with the bad-setup
contract from S12.06 — SolidSyslog_Error(ERR, ...) + nil-object
fallback (SolidSyslogNullSender).
SolidSyslogStreamSender_Create has no equivalent. It happily accepts
a config with NULL Resolver, NULL Stream, or NULL Address, then crashes
on the first SolidSyslogSender_Send when it dereferences the missing
collaborator. CodeRabbit flagged the new config->Address NULL path
on PR #422; deferred from S24.07 because adding only Address
validation without the other three would be inconsistent — fixing the
whole bad-setup contract together is its own atom.
This story brings StreamSender to the same bad-setup posture as
UdpSender.
Current state (audit 2026-05-25, main @ 4b3a361)
Core/Source/SolidSyslogStreamSenderStatic.c::SolidSyslogStreamSender_Create
has no IsValidConfig helper and no NULL-checks on config, Resolver,
Stream, or Address. The only failure path it emits is
STREAMSENDER_ERROR_POOL_EXHAUSTED.
Core/Interface/SolidSyslogStreamSenderErrors.h enum lists only
POOL_EXHAUSTED, UNKNOWN_DESTROY, MAX.
Core/Source/SolidSyslogStreamSenderMessages.c carries only those two
message strings.
Tests/SolidSyslogStreamSenderTest.cpp has no SolidSyslogStreamSenderBadSetup
TEST_GROUP — grep for BadSetup / NULL_RESOLVER returns nothing.
No prior work landed on this story; all four acceptance criteria are
outstanding.
Acceptance criteria
References
Parent epic: #254
Motivation
SolidSyslogUdpSender_Createvalidates its config and rejects NULLResolver/Datagram/Address/Endpointwith the bad-setupcontract from S12.06 —
SolidSyslog_Error(ERR, ...)+ nil-objectfallback (
SolidSyslogNullSender).SolidSyslogStreamSender_Createhas no equivalent. It happily acceptsa config with NULL Resolver, NULL Stream, or NULL Address, then crashes
on the first
SolidSyslogSender_Sendwhen it dereferences the missingcollaborator. CodeRabbit flagged the new
config->AddressNULL pathon PR #422; deferred from S24.07 because adding only
Addressvalidation without the other three would be inconsistent — fixing the
whole bad-setup contract together is its own atom.
This story brings StreamSender to the same bad-setup posture as
UdpSender.
Current state (audit 2026-05-25, main @ 4b3a361)
Core/Source/SolidSyslogStreamSenderStatic.c::SolidSyslogStreamSender_Createhas no
IsValidConfighelper and no NULL-checks onconfig,Resolver,Stream, orAddress. The only failure path it emits isSTREAMSENDER_ERROR_POOL_EXHAUSTED.Core/Interface/SolidSyslogStreamSenderErrors.henum lists onlyPOOL_EXHAUSTED,UNKNOWN_DESTROY,MAX.Core/Source/SolidSyslogStreamSenderMessages.ccarries only those twomessage strings.
Tests/SolidSyslogStreamSenderTest.cpphas noSolidSyslogStreamSenderBadSetupTEST_GROUP — grep for
BadSetup/NULL_RESOLVERreturns nothing.No prior work landed on this story; all four acceptance criteria are
outstanding.
Acceptance criteria
SolidSyslogStreamSender_Createrejectsconfig == NULL,config->Resolver == NULL,config->Stream == NULL, andconfig->Address == NULLwith distinctSTREAMSENDER_ERROR_NULL_{CONFIG,RESOLVER,STREAM,ADDRESS}codes(naming matches the
UDPSENDER_ERROR_NULL_*convention)._CreatereturnsSolidSyslogNullSender_Get()—pool slot is not consumed. Matches
SolidSyslogUdpSender_Create'sIsValidConfig/early-return shape(
Core/Source/SolidSyslogUdpSenderStatic.c:48-76).NULL paths (mirroring the
SolidSyslogUdpSenderBadSetuptests atTests/SolidSyslogUdpSenderTest.cpp:763-823).SolidSyslogStreamSender.hrow updated to note thebad-setup contract (currently says "Pool exhaustion resolves to
the shared
SolidSyslogNullSender"; extend with the bad-configfallback as the
SolidSyslogUdpSender.hrow already does).NULL-rejection paths.
References
config->Addressto StreamSenderConfig; deferred thematching bad-setup validation.