mirror of https://github.com/golang/go.git
[release-branch.go1.17] 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.
For #53423
For CVE-2022-32148
Fixes #53620
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>
(cherry picked from commit b2cc0fecc2)
Reviewed-on: https://go-review.googlesource.com/c/go/+/415221
Reviewed-by: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Heschi Kreinick <heschi@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
d13431c37a
commit
ed2f33e1a7
|
|
@ -101,6 +101,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:]
|
||||||
|
|
|
||||||
|
|
@ -235,6 +235,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…
Reference in New Issue