diff options
author | Yi Zhao <yi.zhao@windriver.com> | 2025-02-21 16:12:07 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2025-02-25 12:17:22 +0000 |
commit | cf8b4459a52d0952bceb91dabad09ff2fff55ea0 (patch) | |
tree | 46f8670db6d95849d22bdf395db7170a18a291e3 | |
parent | 131163d59d668ad29217a62dbc112a18b5701573 (diff) | |
download | poky-cf8b4459a52d0952bceb91dabad09ff2fff55ea0.tar.gz |
kea: avoid assertion on empty DHCPDISCOVER packet
When kea is built with "-D_GLIBCXX_ASSERTIONS " set in SECURITY_CFLAGS,
an assertion occurs if the kea server receives an empty DHCPDISCOVER
packet:
kea-dhcp4[596]: /usr/include/c++/13.3.0/bits/stl_vector.h:1128:
std::vector<Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](size_type)
[with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>; reference = unsigned char&;
size_type = long unsigned int]: Assertion '_n < this->size()' failed.
Backport patches to fix this issue[1].
[1] https://gitlab.isc.org/isc-projects/kea/-/commit/0b98eae16d9b6ecdf57005624712b9b26fa05bc0
https://gitlab.isc.org/isc-projects/kea/-/commit/16306026e37b32a2ce4b16fb5b78561ae153d570
(From OE-Core rev: 17c67a47ec9c6e90a339f32c35f80ca4c908a254)
Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/recipes-connectivity/kea/files/0001-Avoid-assert-on-empty-packet.patch | 148 | ||||
-rw-r--r-- | meta/recipes-connectivity/kea/kea_2.6.1.bb | 1 |
2 files changed, 149 insertions, 0 deletions
diff --git a/meta/recipes-connectivity/kea/files/0001-Avoid-assert-on-empty-packet.patch b/meta/recipes-connectivity/kea/files/0001-Avoid-assert-on-empty-packet.patch new file mode 100644 index 0000000000..14f3424570 --- /dev/null +++ b/meta/recipes-connectivity/kea/files/0001-Avoid-assert-on-empty-packet.patch | |||
@@ -0,0 +1,148 @@ | |||
1 | From 9cf3b6e8d705957927c2fbc9928318f4eda265c8 Mon Sep 17 00:00:00 2001 | ||
2 | From: Thomas Markwalder <tmark@isc.org> | ||
3 | Date: Tue, 11 Feb 2025 18:52:41 +0000 | ||
4 | Subject: [PATCH 1/2] Avoid assert on empty packet | ||
5 | |||
6 | /src/lib/dhcp/pkt_filter_lpf.cc | ||
7 | PktFilterLPF::receive() - throw if packet has no data | ||
8 | |||
9 | /src/lib/util/buffer.h | ||
10 | InputBuffer::readVecotr() - avoid peek if read request length is 0 | ||
11 | |||
12 | /src/lib/util/tests/buffer_unittest.cc | ||
13 | Updated test | ||
14 | |||
15 | Upstream-Status: Backport | ||
16 | [https://gitlab.isc.org/isc-projects/kea/-/commit/0b98eae16d9b6ecdf57005624712b9b26fa05bc0] | ||
17 | [https://gitlab.isc.org/isc-projects/kea/-/commit/16306026e37b32a2ce4b16fb5b78561ae153d570] | ||
18 | |||
19 | Signed-off-by: Yi Zhao <yi.zhao@windriver.com> | ||
20 | --- | ||
21 | src/lib/dhcp/pkt_filter_lpf.cc | 10 +++++++--- | ||
22 | src/lib/util/buffer.h | 9 ++++++--- | ||
23 | src/lib/util/tests/buffer_unittest.cc | 8 +++++++- | ||
24 | 3 files changed, 20 insertions(+), 7 deletions(-) | ||
25 | |||
26 | diff --git a/src/lib/dhcp/pkt_filter_lpf.cc b/src/lib/dhcp/pkt_filter_lpf.cc | ||
27 | index 69bdecc0e1..b0c8f108d3 100644 | ||
28 | --- a/src/lib/dhcp/pkt_filter_lpf.cc | ||
29 | +++ b/src/lib/dhcp/pkt_filter_lpf.cc | ||
30 | @@ -318,9 +318,14 @@ PktFilterLPF::receive(Iface& iface, const SocketInfo& socket_info) { | ||
31 | decodeEthernetHeader(buf, dummy_pkt); | ||
32 | decodeIpUdpHeader(buf, dummy_pkt); | ||
33 | |||
34 | + auto v4_len = buf.getLength() - buf.getPosition(); | ||
35 | + if (v4_len <= 0) { | ||
36 | + isc_throw(SocketReadError, "Pkt4FilterLpf:: packet has no DHCPv4 data"); | ||
37 | + } | ||
38 | + | ||
39 | // Read the DHCP data. | ||
40 | std::vector<uint8_t> dhcp_buf; | ||
41 | - buf.readVector(dhcp_buf, buf.getLength() - buf.getPosition()); | ||
42 | + buf.readVector(dhcp_buf, v4_len); | ||
43 | |||
44 | // Decode DHCP data into the Pkt4 object. | ||
45 | Pkt4Ptr pkt = Pkt4Ptr(new Pkt4(&dhcp_buf[0], dhcp_buf.size())); | ||
46 | @@ -344,8 +349,7 @@ PktFilterLPF::receive(Iface& iface, const SocketInfo& socket_info) { | ||
47 | |||
48 | struct timeval cmsg_time; | ||
49 | memcpy(&cmsg_time, CMSG_DATA(cmsg), sizeof(cmsg_time)); | ||
50 | - pkt->addPktEvent(PktEvent::SOCKET_RECEIVED, cmsg_time); | ||
51 | - break; | ||
52 | + pkt->addPktEvent(PktEvent::SOCKET_RECEIVED, cmsg_time); break; | ||
53 | } | ||
54 | |||
55 | cmsg = CMSG_NXTHDR(&m, cmsg); | ||
56 | diff --git a/src/lib/util/buffer.h b/src/lib/util/buffer.h | ||
57 | index 41ecdf3375..c426a14495 100644 | ||
58 | --- a/src/lib/util/buffer.h | ||
59 | +++ b/src/lib/util/buffer.h | ||
60 | @@ -1,4 +1,4 @@ | ||
61 | -// Copyright (C) 2009-2024 Internet Systems Consortium, Inc. ("ISC") | ||
62 | +// Copyright (C) 2009-2025 Internet Systems Consortium, Inc. ("ISC") | ||
63 | // | ||
64 | // This Source Code Form is subject to the terms of the Mozilla Public | ||
65 | // License, v. 2.0. If a copy of the MPL was not distributed with this | ||
66 | @@ -233,7 +233,8 @@ public: | ||
67 | /// @details If specified buffer is too short, it will be expanded using | ||
68 | /// vector::resize() method. If the remaining length of the buffer | ||
69 | /// is smaller than the specified length, an exception of class | ||
70 | - /// @c isc::OutOfRange will be thrown. | ||
71 | + /// @c isc::OutOfRange will be thrown. Read length zero results | ||
72 | + /// in an empty vector. | ||
73 | /// | ||
74 | /// @param data Reference to a buffer (data will be stored there). | ||
75 | /// @param len Size specified number of bytes to read in a vector. | ||
76 | @@ -244,7 +245,9 @@ public: | ||
77 | } | ||
78 | |||
79 | data.resize(len); | ||
80 | - peekData(&data[0], len); | ||
81 | + if (len) { | ||
82 | + peekData(&data[0], len); | ||
83 | + } | ||
84 | } | ||
85 | |||
86 | /// @brief Read specified number of bytes as a vector. | ||
87 | diff --git a/src/lib/util/tests/buffer_unittest.cc b/src/lib/util/tests/buffer_unittest.cc | ||
88 | index 66c43e8f21..bae051dd16 100644 | ||
89 | --- a/src/lib/util/tests/buffer_unittest.cc | ||
90 | +++ b/src/lib/util/tests/buffer_unittest.cc | ||
91 | @@ -1,4 +1,4 @@ | ||
92 | -// Copyright (C) 2009-2024 Internet Systems Consortium, Inc. ("ISC") | ||
93 | +// Copyright (C) 2009-2025 Internet Systems Consortium, Inc. ("ISC") | ||
94 | // | ||
95 | // This Source Code Form is subject to the terms of the Mozilla Public | ||
96 | // License, v. 2.0. If a copy of the MPL was not distributed with this | ||
97 | @@ -197,6 +197,12 @@ TEST_F(BufferTest, inputBufferRead) { | ||
98 | ASSERT_EQ(sizeof(vdata), datav.size()); | ||
99 | ASSERT_EQ(0, memcmp(&vdata[0], testdata, sizeof(testdata))); | ||
100 | ASSERT_EQ(sizeof(vdata), ibuffer.getPosition()); | ||
101 | + | ||
102 | + // Verify that read len of zero results in an empty | ||
103 | + // vector without throwing. | ||
104 | + datav.resize(8); | ||
105 | + ASSERT_NO_THROW(ibuffer.readVector(datav, 0)); | ||
106 | + ASSERT_EQ(datav.size(), 0); | ||
107 | } | ||
108 | |||
109 | TEST_F(BufferTest, outputBufferReadAt) { | ||
110 | -- | ||
111 | 2.25.1 | ||
112 | |||
113 | From 614a6c136fc20ee428b1c880889ef61253657499 Mon Sep 17 00:00:00 2001 | ||
114 | From: Thomas Markwalder <tmark@isc.org> | ||
115 | Date: Tue, 18 Feb 2025 15:03:12 +0000 | ||
116 | Subject: [PATCH 2/2] Addressed review comments | ||
117 | |||
118 | Couple of typos fixed. | ||
119 | --- | ||
120 | src/lib/dhcp/pkt_filter_lpf.cc | 5 +++-- | ||
121 | 1 file changed, 3 insertions(+), 2 deletions(-) | ||
122 | |||
123 | diff --git a/src/lib/dhcp/pkt_filter_lpf.cc b/src/lib/dhcp/pkt_filter_lpf.cc | ||
124 | index b0c8f108d3..3642915cc1 100644 | ||
125 | --- a/src/lib/dhcp/pkt_filter_lpf.cc | ||
126 | +++ b/src/lib/dhcp/pkt_filter_lpf.cc | ||
127 | @@ -320,7 +320,7 @@ PktFilterLPF::receive(Iface& iface, const SocketInfo& socket_info) { | ||
128 | |||
129 | auto v4_len = buf.getLength() - buf.getPosition(); | ||
130 | if (v4_len <= 0) { | ||
131 | - isc_throw(SocketReadError, "Pkt4FilterLpf:: packet has no DHCPv4 data"); | ||
132 | + isc_throw(SocketReadError, "Pkt4FilterLpf packet has no DHCPv4 data"); | ||
133 | } | ||
134 | |||
135 | // Read the DHCP data. | ||
136 | @@ -349,7 +349,8 @@ PktFilterLPF::receive(Iface& iface, const SocketInfo& socket_info) { | ||
137 | |||
138 | struct timeval cmsg_time; | ||
139 | memcpy(&cmsg_time, CMSG_DATA(cmsg), sizeof(cmsg_time)); | ||
140 | - pkt->addPktEvent(PktEvent::SOCKET_RECEIVED, cmsg_time); break; | ||
141 | + pkt->addPktEvent(PktEvent::SOCKET_RECEIVED, cmsg_time); | ||
142 | + break; | ||
143 | } | ||
144 | |||
145 | cmsg = CMSG_NXTHDR(&m, cmsg); | ||
146 | -- | ||
147 | 2.25.1 | ||
148 | |||
diff --git a/meta/recipes-connectivity/kea/kea_2.6.1.bb b/meta/recipes-connectivity/kea/kea_2.6.1.bb index c2818c3386..ff7fb51fe0 100644 --- a/meta/recipes-connectivity/kea/kea_2.6.1.bb +++ b/meta/recipes-connectivity/kea/kea_2.6.1.bb | |||
@@ -21,6 +21,7 @@ SRC_URI = "http://ftp.isc.org/isc/kea/${PV}/${BP}.tar.gz \ | |||
21 | file://0002-Fix-unittests-Typo-in-Name-Name-append-to-ndata_-not.patch \ | 21 | file://0002-Fix-unittests-Typo-in-Name-Name-append-to-ndata_-not.patch \ |
22 | file://0001-Update-asiolink-for-boost-1.87.patch \ | 22 | file://0001-Update-asiolink-for-boost-1.87.patch \ |
23 | file://0001-make-kea-environment-available-to-lfc.patch \ | 23 | file://0001-make-kea-environment-available-to-lfc.patch \ |
24 | file://0001-Avoid-assert-on-empty-packet.patch \ | ||
24 | " | 25 | " |
25 | SRC_URI[sha256sum] = "d2ce14a91c2e248ad2876e29152d647bcc5e433bc68dafad0ee96ec166fcfad1" | 26 | SRC_URI[sha256sum] = "d2ce14a91c2e248ad2876e29152d647bcc5e433bc68dafad0ee96ec166fcfad1" |
26 | 27 | ||