BindHeaders panics on nil or empty header value slices
Maintainer antworten meist innerhalb von 1 Tag
@SashaMIT arbeitet bereits daran.
Seit 11.10.2026.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 73/100
Rechercherichtung
Beginne in bind.go und verfolge BindHeaders über bindData bis zu den im Issue genannten Pfaden für skalare Maps und getaggte Structs. Verwende die bereitgestellte In-Process-Reproduktion für nil- und leere Header-Wert-Slices und prüfe anschließend alle drei Zieltypen sowie die angegebenen Kontrollfälle. Die Aufgabe ist abgeschlossen, wenn das Binden nicht mehr zu einem Panic führt und das gewählte Verhalten durch Regressionstests abgedeckt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Issue Description
BindHeaders panics when an in-process request header contains a key whose value is a nil or zero-length []string. This is different from []string{""}, which binds without a panic.
On current master, BindHeaders passes the header map to bindData. The scalar-map paths read v[0], and the tagged struct path reads inputValue[0], without checking the slice length. With Header["X-Empty"] = nil or []string{}, these paths panic with index out of range [0] with length 0 instead of returning normally/an error.
This reproduction constructs the request in-process. I have not demonstrated a way for a raw incoming HTTP header to produce this map state, and I am not claiming a remotely exploitable denial of service.
Working code to debug
package echo_test
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/labstack/echo/v5"
)
func TestEmptyHeaderValues(t *testing.T) {
for _, values := range [][]string{nil, {}} {
func() {
defer func() {
if p := recover(); p != nil {
t.Errorf("BindHeaders panicked: %v", p)
}
}()
e := echo.New()
req := httptest.NewRequest(http.MethodGet, "/", nil)
req.Header["X-Empty"] = values
c := e.NewContext(req, httptest.NewRecorder())
var dst struct { Value string `header:"X-Empty"` }
if err := echo.BindHeaders(c, &dst); err != nil {
t.Errorf("BindHeaders: %v", err)
}
}()
}
}
I also reproduced the panic for ordinary *map[string]string and *map[string]any targets. A private table test against unchanged master produced 6 failing panic cases (nil/empty slices × three targets) and 6 passing no-panic controls (normal value/one empty string × three targets). Package go vet passed; no full-suite, race, other Go-version or OS run is claimed.
Proposed narrow follow-up
Would skipping entries with no values be the preferred treatment, or should binding return a specific error? I can prepare a narrow bind.go/regression follow-up after confirming this policy and coordination with #3150, which changes adjacent map assignment code but still indexes v[0]. This would not alter named-map conversions, first-value versus all-values behavior, []string{""} semantics, or existing custom multi-value unmarshalling without agreement. #2778's empty-string-to-nil-pointer proposal is a different input case.
Version/commit
- master
3882266a3641a36fc2111b48cd597adab1c1ecea, modulegithub.com/labstack/echo/v5 - Go 1.27.1, Linux/arm64; synthetic requests, no running application/provider
- OpenAI Codex assisted with source tracing and the reproduction. No production fix/PR has been submitted.
- Vorherrschende Sprache
- Go
- Sterne
- 32.8k
- Forks
- 4.2k
- Ø Merge
- 8 Std. 54 Min.
- Gemergte PRs (30 T.)
- 32
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus labstack/echo
-
Group routes does not work without leading slashEvtl. vergeben @team-humaki hat das vor 23 Tagen übernommen. Offenenhancement router v5
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
labstack/echo#3099 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement v5
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
labstack/echo#3066 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Rate limit middleware doesn't set headers or provide metadata via interface.Evtl. vergeben @AdamMagued hat das vor 4 Tagen übernommen. Offenenhancement middleware
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
labstack/echo#2961 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement router
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 42/100
labstack/echo#2895 · 16 Kommentare · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 45/100
labstack/echo#2803 · 4 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Ähnliche Issues
-
difficulty: easy documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 85/100
-
scaleway_lb_frontend: updating a frontend with external_acls = true deletes all scaleway_lb_aclOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
scaleway/terraform-provider-scaleway#4485 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
Maintainer antworten meist innerhalb von 2 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100