mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Don't switch to using the packet mmap endpoint for zero length requests.
This matches linux's behavior. Reported-by: syzbot+31f4b63198c23c53c6e2@syzkaller.appspotmail.com Reported-by: syzbot+e19f276e27cccbbecd0e@syzkaller.appspotmail.com PiperOrigin-RevId: 724032784
This commit is contained in:
committed by
gVisor bot
parent
d8518f2991
commit
213917f3ea
@@ -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
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user