about summary refs log tree commit diff
path: root/src/n-dhcp4
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-05-04 15:38:03 +0200
committerMichael Biebl <biebl@debian.org>2022-05-04 15:38:03 +0200
commitfc1f1b6881ed5199b4cc81face915769a3dc9897 (patch)
treed2b3f6b775541cece8de7ef9e687c72665f5d820 /src/n-dhcp4
parent16cc38ed3d1761b178512c9a6c291ad366c6fad8 (diff)
parent9959fdb2e8ddd06f2161798ca0a39c77d67c652d (diff)
Update upstream source from tag 'upstream/1.37.92'
Update to upstream version '1.37.92'
with Debian dir 0128b715b1fc3e516169a4599c33567587d59088
Diffstat (limited to 'src/n-dhcp4')
-rw-r--r--src/n-dhcp4/src/n-dhcp4-c-connection.c17
-rw-r--r--src/n-dhcp4/src/n-dhcp4-private.h9
2 files changed, 11 insertions, 15 deletions
diff --git a/src/n-dhcp4/src/n-dhcp4-c-connection.c b/src/n-dhcp4/src/n-dhcp4-c-connection.c
index 2f660e3b..65328286 100644
--- a/src/n-dhcp4/src/n-dhcp4-c-connection.c
+++ b/src/n-dhcp4/src/n-dhcp4-c-connection.c
@@ -1147,16 +1147,21 @@ int n_dhcp4_c_connection_dispatch_timer(NDhcp4CConnection *connection,
 int n_dhcp4_c_connection_dispatch_io(NDhcp4CConnection *connection,
                                      NDhcp4Incoming **messagep) {
         _c_cleanup_(n_dhcp4_incoming_freep) NDhcp4Incoming *message = NULL;
+        _c_cleanup_(c_freep) uint8_t *buffer = NULL;
         char serv_addr[INET_ADDRSTRLEN];
         char client_addr[INET_ADDRSTRLEN];
         uint8_t type = 0;
         int r;
 
+        buffer = malloc(UINT16_MAX);
+        if (!buffer)
+                return -ENOMEM;
+
         switch (connection->state) {
         case N_DHCP4_C_CONNECTION_STATE_PACKET:
                 r = n_dhcp4_c_socket_packet_recv(connection->fd_packet,
-                                                 connection->scratch_buffer,
-                                                 sizeof(connection->scratch_buffer),
+                                                 buffer,
+                                                 UINT16_MAX,
                                                  &message);
                 if (!r)
                         break;
@@ -1165,8 +1170,8 @@ int n_dhcp4_c_connection_dispatch_io(NDhcp4CConnection *connection,
                 return N_DHCP4_E_AGAIN;
         case N_DHCP4_C_CONNECTION_STATE_DRAINING:
                 r = n_dhcp4_c_socket_packet_recv(connection->fd_packet,
-                                                 connection->scratch_buffer,
-                                                 sizeof(connection->scratch_buffer),
+                                                 buffer,
+                                                 UINT16_MAX,
                                                  &message);
                 if (!r)
                         break;
@@ -1188,8 +1193,8 @@ int n_dhcp4_c_connection_dispatch_io(NDhcp4CConnection *connection,
                 /* fall-through */
         case N_DHCP4_C_CONNECTION_STATE_UDP:
                 r = n_dhcp4_c_socket_udp_recv(connection->fd_udp,
-                                              connection->scratch_buffer,
-                                              sizeof(connection->scratch_buffer),
+                                              buffer,
+                                              UINT16_MAX,
                                               &message);
                 if (!r)
                         break;
diff --git a/src/n-dhcp4/src/n-dhcp4-private.h b/src/n-dhcp4/src/n-dhcp4-private.h
index 191e946e..858c3d3a 100644
--- a/src/n-dhcp4/src/n-dhcp4-private.h
+++ b/src/n-dhcp4/src/n-dhcp4-private.h
@@ -334,15 +334,6 @@ struct NDhcp4CConnection {
         uint32_t client_ip;             /* client IP address, or 0 */
         uint32_t server_ip;             /* server IP address, or 0 */
         uint16_t mtu;                   /* client mtu, or 0 */
-
-        /*
-         * When we get DHCP packets from the kernel, we need a buffer to read
-         * the data into. Since UDP packets can be up to 2^16 bytes in size, we
-         * avoid placing it on the stack and instead read into this scratch
-         * buffer. It is purely meant as stack replacement, no data is returned
-         * through this buffer.
-         */
-        uint8_t scratch_buffer[UINT16_MAX];
 };
 
 #define N_DHCP4_C_CONNECTION_NULL(_x) {                                         \