Skip to content

Commit d1fcf06

Browse files
authored
fix sigsev on bind permissions denied (#2250?) (#2251)
Previous behaviour was bugged from somewhere between 1.11.3 and 1.12.0: ```bash ❯❯ frankenphp git:(main) 10:46 ./frankenphp php-server 2026/03/08 03:46:36.541 WARN admin admin endpoint disabled 2026/03/08 03:46:36.541 WARN http.auto_https server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server {"server_name": "php", "http_port": 80} 2026/03/08 03:46:36.542 INFO tls.cache.maintenance started background certificate maintenance {"cache": "0x182aaec16500"} 2026/03/08 03:46:36.582 INFO frankenphp FrankenPHP started 🐘 {"php_version": "8.6.0-dev", "num_threads": 32, "max_threads": 32} panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0xb436bf] goroutine 1 [running]: github.com/caddyserver/caddy/v2.(*Context).Value(0x182aaedbe078?, {0x1e2d340?, 0x25e0c90?}) <autogenerated>:1 +0x1f github.com/caddyserver/caddy/v2/modules/caddyhttp.(*extraFieldsSlogHandler).Handle(_, {_, _}, {{0xc2635a2724e776c5, 0x67b02fd, 0x3ca5000}, {0x22f7b13, 0x17}, 0x0, 0x1b7943e, ...}) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/modules/caddyhttp/logging.go:308 +0x4c log/slog.(*Logger).logAttrs(0x182aaea2bc30, {0x260a170?, 0x182aae96ad20?}, 0x0, {0x22f7b13, 0x17}, {0x0, 0x0, 0x0}) /home/m/static-php-cli/pkgroot/x86_64-linux/go-xcaddy/src/log/slog/logger.go:276 +0x277 log/slog.(*Logger).LogAttrs(...) /home/m/static-php-cli/pkgroot/x86_64-linux/go-xcaddy/src/log/slog/logger.go:194 github.com/dunglas/frankenphp/caddy.(*FrankenPHPApp).Stop(0x182aae844300) /home/m/frankenphp/caddy/app.go:182 +0x14b github.com/caddyserver/caddy/v2.run.func2(...) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/caddy.go:460 github.com/caddyserver/caddy/v2.run(0x25d1e48?, 0x1) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/caddy.go:471 +0x977 github.com/caddyserver/caddy/v2.unsyncedDecodeAndRun({0x182aaee76400, 0x3ad, 0x400}, 0x1) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/caddy.go:364 +0x17a github.com/caddyserver/caddy/v2.changeConfig({0x22c19cb, 0x4}, {0x22c7b94, 0x7}, {0x182aaee76000, 0x3ad, 0x400}, {0x0, 0x0}, 0x1) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/caddy.go:248 +0x959 github.com/caddyserver/caddy/v2.Load({0x182aaee76000, 0x3ad, 0x400}, 0x1) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/caddy.go:137 +0x225 github.com/caddyserver/caddy/v2.Run(0x1fdb7a0?) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/caddy.go:109 +0x3b github.com/dunglas/frankenphp/caddy.cmdPHPServer({0x0?}) /home/m/frankenphp/caddy/php-server.go:320 +0x27b6 github.com/dunglas/frankenphp/caddy.init.4.func1.WrapCommandFuncForCobra.1(0x182aaee53808, {0x22c1a77?, 0x4?, 0x22c1a03?}) /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/cmd/cobra.go:151 +0x2f github.com/spf13/cobra.(*Command).execute(0x182aaee53808, {0x3cc96a0, 0x0, 0x0}) /home/m/go/pkg/mod/github.com/spf13/cobra@v1.10.2/command.go:1015 +0xb14 github.com/spf13/cobra.(*Command).ExecuteC(0x182aae7fbb08) /home/m/go/pkg/mod/github.com/spf13/cobra@v1.10.2/command.go:1148 +0x465 github.com/spf13/cobra.(*Command).Execute(...) /home/m/go/pkg/mod/github.com/spf13/cobra@v1.10.2/command.go:1071 github.com/caddyserver/caddy/v2/cmd.Main() /home/m/go/pkg/mod/github.com/caddyserver/caddy/v2@v2.11.2/cmd/main.go:72 +0x65 main.main() /home/m/frankenphp/caddy/frankenphp/main.go:14 +0xf ``` This restores it to exit cleanly again: ```bash /home/m/frankenphp/caddy/frankenphp/main.go:14 +0xf ❯❯ frankenphp git:(main)  10:46 go build ❯❯ frankenphp git:(main) 10:58 ./frankenphp php-server 2026/03/08 03:58:01.533 WARN admin admin endpoint disabled 2026/03/08 03:58:01.533 WARN http.auto_https server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server {"server_name": "php", "http_port": 80} 2026/03/08 03:58:01.533 INFO tls.cache.maintenance started background certificate maintenance {"cache": "0x850ebf79280"} 2026/03/08 03:58:01.556 INFO tls.cache.maintenance stopped background certificate maintenance {"cache": "0x850ebf79280"} 2026/03/08 03:58:01.556 INFO http servers shutting down with eternal grace period Error: loading new config: http app module: start: listening on :80: listen tcp :80: bind: permission denied ```
1 parent 5979b4d commit d1fcf06

2 files changed

Lines changed: 4 additions & 6 deletions

File tree

caddy/app.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,17 +176,15 @@ func (f *FrankenPHPApp) Start() error {
176176
}
177177

178178
func (f *FrankenPHPApp) Stop() error {
179-
ctx := caddy.ActiveContext()
180-
181-
if f.logger.Enabled(caddy.ActiveContext(), slog.LevelInfo) {
182-
f.logger.LogAttrs(ctx, slog.LevelInfo, "FrankenPHP stopped 🐘")
179+
if f.logger.Enabled(f.ctx, slog.LevelInfo) {
180+
f.logger.LogAttrs(f.ctx, slog.LevelInfo, "FrankenPHP stopped 🐘")
183181
}
184182

185183
// attempt a graceful shutdown if caddy is exiting
186184
// note: Exiting() is currently marked as 'experimental'
187185
// https://github.com/caddyserver/caddy/blob/e76405d55058b0a3e5ba222b44b5ef00516116aa/caddy.go#L810
188186
if caddy.Exiting() {
189-
frankenphp.DrainWorkers()
187+
frankenphp.Shutdown()
190188
}
191189

192190
// reset the configuration so it doesn't bleed into later tests

frankenphp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func calculateMaxThreads(opt *opt) (numWorkers int, _ error) {
211211
return numWorkers, nil
212212
}
213213

214-
if !maxThreadsIsSet && !numThreadsIsSet {
214+
if !numThreadsIsSet {
215215
if numWorkers >= maxProcs {
216216
// Start at least as many threads as workers, and keep a free thread to handle requests in non-worker mode
217217
opt.numThreads = numWorkers + 1

0 commit comments

Comments
 (0)