Skip to content

Commit

Permalink
Don't switch to using the packet mmap endpoint for zero length requests.
Browse files Browse the repository at this point in the history
This matches linux's behavior.

Reported-by: [email protected]
Reported-by: [email protected]
PiperOrigin-RevId: 724032784
  • Loading branch information
manninglucas authored and gvisor-bot committed Feb 6, 2025
1 parent d8518f2 commit 213917f
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
8 changes: 5 additions & 3 deletions pkg/sentry/socket/netstack/netstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -2745,10 +2745,12 @@ func setSockOptPacket(t *kernel.Task, s socket.Socket, ep commonEndpoint, name i
pme = &packetmmap.Endpoint{}
}
opts := ep.GetPacketMMapOpts(&req, true /* isRx */)
if err := pme.Init(t, opts); err != nil {
return syserr.FromError(err)
if opts.Req.TpFrameNr != 0 || opts.Req.TpBlockNr != 0 {
if err := pme.Init(t, opts); err != nil {
return syserr.FromError(err)
}
ep.SetPacketMMapEndpoint(pme)
}
ep.SetPacketMMapEndpoint(pme)
} else {
return syserr.ErrNotSupported
}
Expand Down
26 changes: 26 additions & 0 deletions test/syscalls/linux/packet_mmap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,32 @@ TEST(PacketMmapTest, FillBlocks) {
EXPECT_STREQ((char*)(hdr) + hdr->tp_net, kNewMessage.c_str());
}

TEST(PacketMmapTest, ZeroSizeRing) {
if (!ASSERT_NO_ERRNO_AND_VALUE(HaveCapability(CAP_NET_RAW))) {
ASSERT_THAT(socket(AF_PACKET, SOCK_RAW, 0), SyscallFailsWithErrno(EPERM));
GTEST_SKIP() << "Missing packet socket capability";
}
sockaddr_ll bind_addr = {
.sll_family = AF_PACKET,
.sll_protocol = htons(ETH_P_IP),
.sll_ifindex = ASSERT_NO_ERRNO_AND_VALUE(GetLoopbackIndex()),
.sll_halen = ETH_ALEN,
};
FileDescriptor mmap_sock =
ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_PACKET, SOCK_DGRAM, 0));

tpacket_req req = {};
ASSERT_NO_ERRNO_AND_VALUE(MakePacketMmapRing(
mmap_sock.get(), reinterpret_cast<const sockaddr*>(&bind_addr),
sizeof(bind_addr), &req));

std::string kMessage = "123abc";
ASSERT_THAT(
sendto(mmap_sock.get(), kMessage.c_str(), kMessage.size(), 0 /* flags */,
reinterpret_cast<const sockaddr*>(&bind_addr), sizeof(bind_addr)),
SyscallSucceeds());
}

TEST(PacketMmapTest, ConcurrentReadWrite) {
if (!ASSERT_NO_ERRNO_AND_VALUE(HaveCapability(CAP_NET_RAW))) {
ASSERT_THAT(socket(AF_PACKET, SOCK_RAW, 0), SyscallFailsWithErrno(EPERM));
Expand Down

0 comments on commit 213917f

Please sign in to comment.