Record sockets created during accept(2) for all families.

Track new sockets created during accept(2) in the socket table for all
families. Previously we were only doing this for unix domain sockets.

PiperOrigin-RevId: 239475550
Change-Id: I16f009f24a06245bfd1d72ffd2175200f837c6ac
This commit is contained in:
Rahat Mahmood
2019-03-20 14:31:16 -07:00
committed by Shentubot
parent c7877b0a14
commit 81f4829d11
3 changed files with 13 additions and 6 deletions
+2
View File
@@ -504,6 +504,8 @@ func (s *SocketOperations) Accept(t *kernel.Task, peerRequested bool, flags int,
}
fd, e := t.FDMap().NewFDFrom(0, ns, fdFlags, t.ThreadGroup().Limits())
t.Kernel().RecordSocket(ns, s.family)
return fd, addr, addrLen, syserr.FromError(e)
}
+8 -6
View File
@@ -53,14 +53,15 @@ type socketOperations struct {
fsutil.FileNoMMap `state:"nosave"`
socket.SendReceiveTimeout
fd int // must be O_NONBLOCK
queue waiter.Queue
family int // Read-only.
fd int // must be O_NONBLOCK
queue waiter.Queue
}
var _ = socket.Socket(&socketOperations{})
func newSocketFile(ctx context.Context, fd int, nonblock bool) (*fs.File, *syserr.Error) {
s := &socketOperations{fd: fd}
func newSocketFile(ctx context.Context, family int, fd int, nonblock bool) (*fs.File, *syserr.Error) {
s := &socketOperations{family: family, fd: fd}
if err := fdnotifier.AddFD(int32(fd), &s.queue); err != nil {
return nil, syserr.FromError(err)
}
@@ -218,7 +219,7 @@ func (s *socketOperations) Accept(t *kernel.Task, peerRequested bool, flags int,
return 0, peerAddr, peerAddrlen, syserr.FromError(syscallErr)
}
f, err := newSocketFile(t, fd, flags&syscall.SOCK_NONBLOCK != 0)
f, err := newSocketFile(t, s.family, fd, flags&syscall.SOCK_NONBLOCK != 0)
if err != nil {
syscall.Close(fd)
return 0, nil, 0, err
@@ -229,6 +230,7 @@ func (s *socketOperations) Accept(t *kernel.Task, peerRequested bool, flags int,
CloseOnExec: flags&syscall.SOCK_CLOEXEC != 0,
}
kfd, kerr := t.FDMap().NewFDFrom(0, f, fdFlags, t.ThreadGroup().Limits())
t.Kernel().RecordSocket(f, s.family)
return kfd, peerAddr, peerAddrlen, syserr.FromError(kerr)
}
@@ -552,7 +554,7 @@ func (p *socketProvider) Socket(t *kernel.Task, stypeflags transport.SockType, p
if err != nil {
return nil, syserr.FromError(err)
}
return newSocketFile(t, fd, stypeflags&syscall.SOCK_NONBLOCK != 0)
return newSocketFile(t, p.family, fd, stypeflags&syscall.SOCK_NONBLOCK != 0)
}
// Pair implements socket.Provider.Pair.
+3
View File
@@ -52,6 +52,7 @@ type socketOperations struct {
fsutil.FileNoMMap `state:"nosave"`
socket.SendReceiveTimeout
family int // Read-only.
fd uint32 // must be O_NONBLOCK
wq *waiter.Queue
rpcConn *conn.RPCConnection
@@ -83,6 +84,7 @@ func newSocketFile(ctx context.Context, stack *Stack, family int, skType int, pr
dirent := socket.NewDirent(ctx, socketDevice)
defer dirent.DecRef()
return fs.NewFile(ctx, dirent, fs.FileFlags{Read: true, Write: true}, &socketOperations{
family: family,
wq: &wq,
fd: fd,
rpcConn: stack.rpcConn,
@@ -329,6 +331,7 @@ func (s *socketOperations) Accept(t *kernel.Task, peerRequested bool, flags int,
if err != nil {
return 0, nil, 0, syserr.FromError(err)
}
t.Kernel().RecordSocket(file, s.family)
if peerRequested {
return fd, payload.Address.Address, payload.Address.Length, nil