Skip to content

Fix set-status crash inside if/endif at remap time#13052

Draft
moonchen wants to merge 1 commit intoapache:masterfrom
moonchen:worktree-master-set-status-fix
Draft

Fix set-status crash inside if/endif at remap time#13052
moonchen wants to merge 1 commit intoapache:masterfrom
moonchen:worktree-master-set-status-fix

Conversation

@moonchen
Copy link
Copy Markdown
Contributor

@moonchen moonchen commented Apr 2, 2026

Operators inside an if/endif block never had set_hook() called on them, so _hook retained its default value of TS_HTTP_READ_RESPONSE_HDR_HOOK. When set-status executed at REMAP_PSEUDO_HOOK time, exec() took the response-hook branch and called TSHttpHdrStatusSet on a request buffer, corrupting the header union and crashing.

Fix the operator to check TSHttpHdrTypeGet() at runtime instead of trusting get_hook(). Removed _hook and get_hook() from operators.

set_hook() becomes is_hook_valid() in Statement and RuleSet to only validate hook compatibility without mutating _hook.

Upgrade the HTTPHdr::status_set/reason_set asserts to release_assert so that writing response fields into a request buffer is caught immediately rather than silently corrupting memory.

Includes an autest that reproduces the crash scenario: set-status 403 inside an if/endif block under REMAP_PSEUDO_HOOK.

@moonchen moonchen requested a review from zwoop April 2, 2026 18:41
@moonchen moonchen self-assigned this Apr 2, 2026
@moonchen moonchen added Plugins header_rewrite header_rewrite plugin Bug and removed Plugins header_rewrite header_rewrite plugin labels Apr 2, 2026
@moonchen moonchen added this to the 11.0.0 milestone Apr 2, 2026
Operators inside an if/endif block never had set_hook() called on them,
so _hook retained its default value of TS_HTTP_READ_RESPONSE_HDR_HOOK.
When set-status executed at REMAP_PSEUDO_HOOK time, exec() took the
response-hook branch and called TSHttpHdrStatusSet on a request buffer,
corrupting the header union and crashing.

Fix the operator to check TSHttpHdrTypeGet() at runtime instead of
trusting get_hook().  Removed _hook and get_hook() from operators.

set_hook() becomes is_hook_valid() in Statement and RuleSet to
only validate hook compatibility without mutating _hook.

Upgrade the HTTPHdr::status_set/reason_set asserts to release_assert so
that writing response fields into a request buffer is caught immediately
rather than silently corrupting memory.

Includes an autest that reproduces the crash scenario: set-status 403
inside an if/endif block under REMAP_PSEUDO_HOOK.
@moonchen moonchen force-pushed the worktree-master-set-status-fix branch from f480c1b to 7cff341 Compare April 2, 2026 18:46
@moonchen moonchen marked this pull request as draft April 2, 2026 18:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Bug header_rewrite header_rewrite plugin Plugins

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

1 participant