]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
do checks at parse time, not when each socket opens developer/alandekok master
authorAlan T. DeKok <aland@freeradius.org>
Thu, 18 Jun 2026 15:08:57 +0000 (11:08 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 18 Jun 2026 15:16:47 +0000 (11:16 -0400)
src/lib/bio/fd_config.c
src/lib/bio/fd_open.c

index 6c9a3205d7c6a4e7b533b2486ee5720693c10c1e..caa8797f81bebcbf09a4bee8f860da6ef666cebe 100644 (file)
@@ -54,6 +54,23 @@ static int mode_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, CO
        return 0;
 }
 
+static int send_recv_buf_parse(TALLOC_CTX *ctx, void *out, void *parent, CONF_ITEM *ci, conf_parser_t const *rule)
+{
+       uint32_t size;
+
+       if (cf_table_parse_uint32(ctx, out, parent, ci, rule) < 0) {
+               return -1;
+       }
+
+       size = *(uint32_t *) out;
+       if (size > INT_MAX) {
+               cf_log_err(ci, "Invalid value - it is too large");
+               return -1;
+       }
+
+       return 0;
+}
+
 /** Parse "transport" and then set the subconfig
  *
  */
@@ -124,8 +141,8 @@ static const conf_parser_t client_udp_sub_config[] = {
        { FR_CONF_OFFSET("exceed_mtu", fr_bio_fd_config_t, exceed_mtu), .dflt = "yes" },
 #endif
 
-       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff) },
-       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff) },
+       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff), .func = send_recv_buf_parse },
+       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
 
        CONF_PARSER_TERMINATOR
 };
@@ -151,8 +168,8 @@ static const conf_parser_t client_udp_unconnected_sub_config[] = {
        { FR_CONF_OFFSET("exceed_mtu", fr_bio_fd_config_t, exceed_mtu), .dflt = "yes" },
 #endif
 
-       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff) },
-       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff) },
+       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff), .func = send_recv_buf_parse },
+       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
 
        CONF_PARSER_TERMINATOR
 };
@@ -181,8 +198,8 @@ static const conf_parser_t client_tcp_sub_config[] = {
 
        { FR_CONF_OFFSET("interface", fr_bio_fd_config_t, interface) },
 
-       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff) },
-       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff) },
+       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff), .func = send_recv_buf_parse },
+       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
 
        { FR_CONF_OFFSET("delay_tcp_writes", fr_bio_fd_config_t, tcp_delay) },
 
@@ -296,8 +313,8 @@ static const conf_parser_t server_udp_sub_config[] = {
 
        { FR_CONF_OFFSET("interface", fr_bio_fd_config_t, interface) },
 
-       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff) },
-       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff) },
+       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff), .func = send_recv_buf_parse },
+       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
 
 #if (defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT)) || defined(IP_DONTFRAG)
        { FR_CONF_OFFSET("exceed_mtu", fr_bio_fd_config_t, exceed_mtu), .dflt = "yes" },
@@ -323,8 +340,8 @@ static const conf_parser_t server_tcp_sub_config[] = {
 
        { FR_CONF_OFFSET_IS_SET("backlog", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, backlog) },
 
-       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff) },
-       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff) },
+       { FR_CONF_OFFSET_IS_SET("recv_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, recv_buff), .func = send_recv_buf_parse },
+       { FR_CONF_OFFSET_IS_SET("send_buff", FR_TYPE_UINT32, 0, fr_bio_fd_config_t, send_buff), .func = send_recv_buf_parse },
 
        { FR_CONF_OFFSET("delay_tcp_writes", fr_bio_fd_config_t, tcp_delay) },
 
index a5fce97bbaf715a176fb0bee1553c6696f46dd8d..5ab9f78c48b4204ce7b89c6664755a47db437f06 100644 (file)
@@ -126,10 +126,8 @@ static int fr_bio_fd_common_datagram(int fd, UNUSED fr_socket_t const *sock, fr_
        if (cfg->recv_buff) {
                int opt;
 
-               /*
-                *      Clamp value to something reasonable.
-                */
-               opt = (cfg->recv_buff > INT_MAX) ? INT_MAX : (int) cfg->recv_buff;
+               fr_assert(cfg->recv_buff <= INT_MAX);
+               opt = (int) cfg->recv_buff;
 
                if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) < 0) {
                        fr_strerror_printf("Failed setting SO_RCVBUF: %s", fr_syserror(errno));
@@ -142,10 +140,8 @@ static int fr_bio_fd_common_datagram(int fd, UNUSED fr_socket_t const *sock, fr_
        if (cfg->send_buff) {
                int opt;
 
-               /*
-                *      Clamp value to something reasonable.
-                */
-               opt = (cfg->send_buff > INT_MAX) ? INT_MAX : (int) cfg->send_buff;
+               fr_assert(cfg->send_buff <= INT_MAX);
+               opt = (int) cfg->send_buff;
 
                if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt)) < 0) {
                        fr_strerror_printf("Failed setting SO_SNDBUF: %s", fr_syserror(errno));