unix: add ParseOneSocketControlMessage to parse control messages without allocating

Fixes golang/go#54714.

Change-Id: If711272937078b6c696756823aa4dfcec358b719
Reviewed-on: https://go-review.googlesource.com/c/sys/+/425917
Reviewed-by: Matt Layher <mdlayher@gmail.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Run-TryBot: Matt Layher <mdlayher@gmail.com>
This commit is contained in:
Marten Seemann
2022-11-02 19:48:38 +00:00
committed by Gopher Robot
parent 5726498127
commit fc697a31fa
2 changed files with 32 additions and 1 deletions
+18 -1
View File
@@ -322,7 +322,7 @@ func passFDChild() {
}
}
// TestUnixRightsRoundtrip tests that UnixRights, ParseSocketControlMessage,
// TestUnixRightsRoundtrip tests that UnixRights, ParseSocketControlMessage, ParseOneSocketControlMessage,
// and ParseUnixRights are able to successfully round-trip lists of file descriptors.
func TestUnixRightsRoundtrip(t *testing.T) {
testCases := [...][][]int{
@@ -350,6 +350,23 @@ func TestUnixRightsRoundtrip(t *testing.T) {
if len(scms) != len(testCase) {
t.Fatalf("expected %v SocketControlMessage; got scms = %#v", len(testCase), scms)
}
var c int
for len(b) > 0 {
hdr, data, remainder, err := unix.ParseOneSocketControlMessage(b)
if err != nil {
t.Fatalf("ParseOneSocketControlMessage: %v", err)
}
if scms[c].Header != hdr || !bytes.Equal(scms[c].Data, data) {
t.Fatal("expected SocketControlMessage header and data to match")
}
b = remainder
c++
}
if c != len(scms) {
t.Fatalf("expected %d SocketControlMessages; got %d", len(scms), c)
}
for i, scm := range scms {
gotFds, err := unix.ParseUnixRights(&scm)
if err != nil {