BindHeaders panics on nil or empty header value slices
Les mainteneurs répondent en général sous 1 jour
@SashaMIT y travaille déjà.
Depuis le 11/10/2026.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 73/100
Piste de recherche
Commencez dans bind.go et suivez BindHeaders via bindData jusqu’aux chemins des maps scalaires et des structs avec tags indiqués dans l’issue. Utilisez la reproduction en processus fournie pour les slices de valeurs d’en-tête nil et vides, puis vérifiez les trois types cibles ainsi que les cas témoins indiqués. Le travail est terminé lorsque le binding ne provoque plus de panic et que le comportement choisi est couvert par des tests de régression.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- Go
- Étoiles
- 32.8k
- Forks
- 4.2k
- Merge moyen
- 8 h 54 min
- PR mergées (30 j)
- 32
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de labstack/echo
-
Group routes does not work without leading slashPeut-être pris @team-humaki l’a pris il y a 22 jours. Ouverteenhancement router v5
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
labstack/echo#3099 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement v5
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
labstack/echo#3066 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Rate limit middleware doesn't set headers or provide metadata via interface.Peut-être pris @AdamMagued l’a pris il y a 3 jours. Ouverteenhancement middleware
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
labstack/echo#2961 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement router
Difficulté 4/5 3-5 jours Accessibilité débutants 42/100
labstack/echo#2895 · 16 commentaires · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
azure front door x-forwaded-forOuverteenhancement
Difficulté 3/5 1-2 jours Accessibilité débutants 45/100
labstack/echo#2803 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de labstack/echo
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
cli: cav scene save treats unknown flags before path (e.g. --timeout) as the output filenameOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 73/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 63/100
Les mainteneurs répondent en général sous 1 jour
-
product/backlog
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
TencentBlueKing/bk-nodemgr#3645 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
modelcontextprotocol/go-sdk#1387 ·
Les mainteneurs répondent en général sous 1 jour