decodeEthernetHeader(buf, dummy_pkt);
decodeIpUdpHeader(buf, dummy_pkt);
+ auto v4_len = buf.getLength() - buf.getPosition();
+ if (v4_len <= 0) {
+ isc_throw(SocketReadError, "Pkt4FilterLpf packet has no DHCPv4 data");
+ }
+
// Read the DHCP data.
std::vector<uint8_t> dhcp_buf;
- buf.readVector(dhcp_buf, buf.getLength() - buf.getPosition());
+ buf.readVector(dhcp_buf, v4_len);
// Decode DHCP data into the Pkt4 object.
Pkt4Ptr pkt = Pkt4Ptr(new Pkt4(&dhcp_buf[0], dhcp_buf.size()));
struct timeval cmsg_time;
memcpy(&cmsg_time, CMSG_DATA(cmsg), sizeof(cmsg_time));
- pkt->addPktEvent(PktEvent::SOCKET_RECEIVED, cmsg_time);
- break;
+ pkt->addPktEvent(PktEvent::SOCKET_RECEIVED, cmsg_time); break;
}
cmsg = CMSG_NXTHDR(&m, cmsg);
-// Copyright (C) 2009-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2009-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
/// @details If specified buffer is too short, it will be expanded using
/// vector::resize() method. If the remaining length of the buffer
/// is smaller than the specified length, an exception of class
- /// @c isc::OutOfRange will be thrown.
+ /// @c isc::OutOfRange will be thrown. Read length zero results
+ /// in an empty vector.
///
/// @param data Reference to a buffer (data will be stored there).
/// @param len Size specified number of bytes to read in a vector.
}
data.resize(len);
- peekData(&data[0], len);
+ if (len) {
+ peekData(&data[0], len);
+ }
}
/// @brief Read specified number of bytes as a vector.
-// Copyright (C) 2009-2024 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2009-2025 Internet Systems Consortium, Inc. ("ISC")
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
ASSERT_EQ(sizeof(vdata), datav.size());
ASSERT_EQ(0, memcmp(&vdata[0], testdata, sizeof(testdata)));
ASSERT_EQ(sizeof(vdata), ibuffer.getPosition());
+
+ // Verify that read len of zero results in an empty
+ // vector without throwing.
+ datav.resize(8);
+ ASSERT_NO_THROW(ibuffer.readVector(datav, 0));
+ ASSERT_EQ(datav.size(), 0);
}
TEST_F(BufferTest, outputBufferReadAt) {