mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
net/http: preserve nil values in Header.Clone
ReverseProxy makes a distinction between nil and zero-length header values. Avoid losing nil-ness when cloning a request. Thanks to Christian Mehlmauer for discovering this. Fixes #53423 Fixes CVE-2022-32148 Change-Id: Ice369cdb4712e2d62e25bb881b080847aa4801f5 Reviewed-on: https://go-review.googlesource.com/c/go/+/412857 Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
64ef16e777
commit
b2cc0fecc2
2 changed files with 11 additions and 0 deletions
|
|
@ -103,6 +103,12 @@ func (h Header) Clone() Header {
|
||||||
sv := make([]string, nv) // shared backing array for headers' values
|
sv := make([]string, nv) // shared backing array for headers' values
|
||||||
h2 := make(Header, len(h))
|
h2 := make(Header, len(h))
|
||||||
for k, vv := range h {
|
for k, vv := range h {
|
||||||
|
if vv == nil {
|
||||||
|
// Preserve nil values. ReverseProxy distinguishes
|
||||||
|
// between nil and zero-length header values.
|
||||||
|
h2[k] = nil
|
||||||
|
continue
|
||||||
|
}
|
||||||
n := copy(sv, vv)
|
n := copy(sv, vv)
|
||||||
h2[k] = sv[:n:n]
|
h2[k] = sv[:n:n]
|
||||||
sv = sv[n:]
|
sv = sv[n:]
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,11 @@ func TestCloneOrMakeHeader(t *testing.T) {
|
||||||
in: Header{"foo": {"bar"}},
|
in: Header{"foo": {"bar"}},
|
||||||
want: Header{"foo": {"bar"}},
|
want: Header{"foo": {"bar"}},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "nil value",
|
||||||
|
in: Header{"foo": nil},
|
||||||
|
want: Header{"foo": nil},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue