Skip to content

Panic (SIGSEGV) when combining conditional headers (?) and explicit defer in header block #6893

@Kuppit

Description

@Kuppit

Caddy version:

v2.9.1

Description:

When using conditional headers (with the ? prefix) together with an explicit defer directive inside a named header block, Caddy crashes with a panic (SIGSEGV) at startup instead of gracefully failing or ignoring unnecessary defer directive.

Minimal reproducible config (Caddyfile):

:80 {
  header {
    ?X-Test-Header "Test value"
    defer
  }
}

Removing the explicit defer fixes the issue, as the conditional ? directive implicitly activates defer.

Expected behavior:

  • Caddy should either ignore explicitly defined defer in conditional header blocks with ?, or clearly warn/log a configuration error. It should not panic and crash.

Actual behavior:

  • Caddy panics with a segmentation fault (SIGSEGV).

Error output:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0x144e77d]

goroutine 1 [running]:
github.com/caddyserver/caddy/v2/modules/caddyhttp/headers.(*HeaderOps).Provision(0xc0001461c0?, {{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc0001461c0, 0x2, 0x2}, {0x0, 0x0, ...}, ...})
        github.com/caddyserver/caddy/v2@v2.9.1/modules/caddyhttp/headers/headers.go:136 +0x1d
github.com/caddyserver/caddy/v2/modules/caddyhttp/headers.(*Handler).Provision(0x20?, {{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc0001461c0, 0x2, 0x2}, {0x0, 0x0, ...}, ...})
        github.com/caddyserver/caddy/v2@v2.9.1/modules/caddyhttp/headers/headers.go:65 +0x9c
github.com/caddyserver/caddy/v2.Context.LoadModuleByID({{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc0001461c0, 0x2, 0x2}, {0x0, 0x0, 0x0}, ...}, ...)
        github.com/caddyserver/caddy/v2@v2.9.1/context.go:391 +0x695
github.com/caddyserver/caddy/v2.Context.loadModuleInline({{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc00003b440, 0x1, 0x1}, {0x0, 0x0, 0x0}, ...}, ...)
        github.com/caddyserver/caddy/v2@v2.9.1/context.go:441 +0xf0
github.com/caddyserver/caddy/v2.Context.LoadModule({{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc00003b440, 0x1, 0x1}, {0x0, 0x0, 0x0}, ...}, ...)
        github.com/caddyserver/caddy/v2@v2.9.1/context.go:222 +0x706
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*Route).ProvisionHandlers(0xc000a9ecc8, {{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc00003b440, 0x1, 0x1}, {0x0, 0x0, ...}, ...}, ...)
        github.com/caddyserver/caddy/v2@v2.9.1/modules/caddyhttp/routes.go:154 +0x71
github.com/caddyserver/caddy/v2/modules/caddyhttp.RouteList.ProvisionHandlers({0xc000a9ea88, 0xf, 0x1d2348b?}, {{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc00003b440, 0x1, 0x1}, ...}, ...)
        github.com/caddyserver/caddy/v2@v2.9.1/modules/caddyhttp/routes.go:212 +0xa9
github.com/caddyserver/caddy/v2/modules/caddyhttp.(*App).Provision(0xc000ac65b0, {{0x22c77b8, 0xc0006c30e0}, 0xc000115380, 0xc000944960, {0xc00003b440, 0x1, 0x1}, {0x0, 0x0, ...}, ...})
        github.com/caddyserver/caddy/v2@v2.9.1/modules/caddyhttp/app.go:367 +0xf25
github.com/caddyserver/caddy/v2.Context.LoadModuleByID({{0x22c77f0, 0xc000362b40}, 0xc000115380, 0xc000944960, {0xc00003b440, 0x1, 0x1}, {0x0, 0x0, 0x0}, ...}, ...)
        github.com/caddyserver/caddy/v2@v2.9.1/context.go:391 +0x695
github.com/caddyserver/caddy/v2.Context.App({{0x22c77f0, 0xc000362b40}, 0xc000115380, 0xc000944960, {0x0, 0x0, 0x0}, {0x0, 0x0, 0x0}, ...}, ...)
        github.com/caddyserver/caddy/v2@v2.9.1/context.go:467 +0xee
github.com/caddyserver/caddy/v2.provisionContext.func3(...)
        github.com/caddyserver/caddy/v2@v2.9.1/caddy.go:545
github.com/caddyserver/caddy/v2.provisionContext(0xc0000633e0?, 0x1)
        github.com/caddyserver/caddy/v2@v2.9.1/caddy.go:550 +0x53c
github.com/caddyserver/caddy/v2.run(0xd?, 0x1)
        github.com/caddyserver/caddy/v2@v2.9.1/caddy.go:400 +0x78
github.com/caddyserver/caddy/v2.unsyncedDecodeAndRun({0xc000ab1800, 0x1565, 0x1800}, 0x1)
        github.com/caddyserver/caddy/v2@v2.9.1/caddy.go:343 +0x145
github.com/caddyserver/caddy/v2.changeConfig({0x1cf2f48, 0x4}, {0x1d06882, 0x7}, {0xc000ab0000, 0x1565, 0x1800}, {0x0, 0x0}, 0x1)
        github.com/caddyserver/caddy/v2@v2.9.1/caddy.go:234 +0x6b6
github.com/caddyserver/caddy/v2.Load({0xc000ab0000, 0x1565, 0x1800}, 0x1)
        github.com/caddyserver/caddy/v2@v2.9.1/caddy.go:133 +0x22d
github.com/caddyserver/caddy/v2/cmd.cmdRun({0x0?})
        github.com/caddyserver/caddy/v2@v2.9.1/cmd/commandfuncs.go:235 +0x831
github.com/caddyserver/caddy/v2/cmd.init.1.func2.WrapCommandFuncForCobra.1(0xc0008d4f08, {0x1cf2fdc?, 0x4?, 0x1cf2f78?})
        github.com/caddyserver/caddy/v2@v2.9.1/cmd/cobra.go:141 +0x2f
github.com/spf13/cobra.(*Command).execute(0xc0008d4f08, {0xc0003be740, 0x4, 0x4})
        github.com/spf13/cobra@v1.9.1/command.go:1015 +0xa94
github.com/spf13/cobra.(*Command).ExecuteC(0xc0008d4908)
        github.com/spf13/cobra@v1.9.1/command.go:1148 +0x40c
github.com/spf13/cobra.(*Command).Execute(...)
        github.com/spf13/cobra@v1.9.1/command.go:1071
github.com/caddyserver/caddy/v2/cmd.Main()
        github.com/caddyserver/caddy/v2@v2.9.1/cmd/main.go:75 +0x1dd
main.main()
        caddy/main.go:16 +0xf

Workaround:

Do not explicitly specify defer within header blocks that only have conditional (?) headers, as these already implicitly enable defer.

Metadata

Metadata

Assignees

Labels

bug 🐞Something isn't working

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions