Skip to content

dispatch: bare cfabort crashes every Adobe engine in the public-component 404 branch #3029

Description

@bpamiri

Source

Discussion #3023 (mikegrogan, stock 4.0.3 on ACF 2025). Verified and reproduced on Adobe 2023 — this is an all-Adobe crash, not an ACF 2025 quirk.

Bug

vendor/wheels/Dispatch.cfc:400 ends the enablePublicComponent=false anti-fingerprinting block (issue #2233) with bare cfabort;. That statement form is Lucee-only; Adobe parses it as a reference to an undefined variable named cfabort and throws Variable CFABORT is undefined at runtime.

Blast radius: in testing/production the public component is disabled, and the stock app's homepage is served by it — so GET / on a stock Adobe install in testing/production hits this branch on every request:

  • testing (showErrorInformation=true): raw Variable CFABORT is undefined error page (discussion symptom 2).
  • production: the block emits Not Found, then the crash bubbles into the friendly error template — composite Not Found + "Something went wrong", HTTP 500 (discussion symptom 3, byte-for-byte).

Repro (docker harness, environment=testing): Adobe 2023 → GET /wheels/info = HTTP 500, body Not Found + CFABORT-undefined error. Lucee 7 control → clean 404 Not Found, 10 bytes.

Why CI never caught it

vendor/wheels/tests/specs/security/PublicComponentProductionSpec.cfc:188-208 validates this branch by source inspection (regex for statuscode=404) — the branch has zero execution coverage on any engine.

Fix

  • One token: cfabort;abort; (only bare-script occurrence in vendor/wheels; public/views/cli.cfm:1085 and wheelstest/.../XMLConverter.cfc:255 are tag-context <cfabort>, fine).
  • Add a structural guard spec forbidding bare cfabort; statements in script context across vendor/wheels/**/*.cfc (an abort cannot execute inside a spec without killing the runner, so the structural scan + a documented manual cross-engine repro is the practical gate).
  • Acceptance: on BOTH Lucee 7 and Adobe 2023 (docker harness, environment=testing), GET /wheels/info and GET / return clean 404 Not Found with no error template.

Candidate for a new Cross-Engine Invariant in CLAUDE.md: bare tag-in-script statements without parentheses (cfabort;) are Lucee-only — use the script keyword (abort;) or parenthesized form.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions