mirror of
https://blitiri.com.ar/repos/chasquid
synced 2025-12-17 14:37:02 +00:00
envelope: Handle zero-length keys in AddHeader
We don't expect the AddHeader function to be given an empty key; however, if that were to happen, it currently crashes. This patch fixes the bug, while also adding tests for that and other similar cases.
This commit is contained in:
@@ -39,11 +39,13 @@ func DomainIn(addr string, locals *set.String) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func AddHeader(data []byte, k, v string) []byte {
|
func AddHeader(data []byte, k, v string) []byte {
|
||||||
|
if len(v) > 0 {
|
||||||
// If the value contains newlines, indent them properly.
|
// If the value contains newlines, indent them properly.
|
||||||
if v[len(v)-1] == '\n' {
|
if v[len(v)-1] == '\n' {
|
||||||
v = v[:len(v)-1]
|
v = v[:len(v)-1]
|
||||||
}
|
}
|
||||||
v = strings.Replace(v, "\n", "\n\t", -1)
|
v = strings.Replace(v, "\n", "\n\t", -1)
|
||||||
|
}
|
||||||
|
|
||||||
header := []byte(fmt.Sprintf("%s: %s\n", k, v))
|
header := []byte(fmt.Sprintf("%s: %s\n", k, v))
|
||||||
return append(header, data...)
|
return append(header, data...)
|
||||||
|
|||||||
@@ -41,3 +41,29 @@ func TestDomainIn(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAddHeader(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
data, k, v, expected string
|
||||||
|
}{
|
||||||
|
{"", "Key", "Value", "Key: Value\n"},
|
||||||
|
{"data", "Key", "Value", "Key: Value\ndata"},
|
||||||
|
{"data", "Key", "Value\n", "Key: Value\ndata"},
|
||||||
|
{"data", "Key", "L1\nL2", "Key: L1\n\tL2\ndata"},
|
||||||
|
{"data", "Key", "L1\nL2\n", "Key: L1\n\tL2\ndata"},
|
||||||
|
|
||||||
|
// Degenerate cases: we don't expect to ever produce these, and the
|
||||||
|
// output is admittedly not nice, but they should at least not cause
|
||||||
|
// chasquid to crash.
|
||||||
|
{"data", "Key", "", "Key: \ndata"},
|
||||||
|
{"data", "", "", ": \ndata"},
|
||||||
|
{"", "", "", ": \n"},
|
||||||
|
}
|
||||||
|
for i, c := range cases {
|
||||||
|
got := string(AddHeader([]byte(c.data), c.k, c.v))
|
||||||
|
if got != c.expected {
|
||||||
|
t.Errorf("%d (%q -> %q): expected %q, got %q",
|
||||||
|
i, c.k, c.v, c.expected, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user