From: Alan T. DeKok Date: Thu, 18 Jun 2026 15:08:57 +0000 (-0400) Subject: do checks at parse time, not when each socket opens X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;ds=sidebyside;p=thirdparty%2Ffreeradius-server.git do checks at parse time, not when each socket opens --- diff --git a/src/lib/bio/fd_config.c b/src/lib/bio/fd_config.c index 6c9a3205d7c..caa8797f81b 100644 --- a/src/lib/bio/fd_config.c +++ b/src/lib/bio/fd_config.c @@ -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) }, diff --git a/src/lib/bio/fd_open.c b/src/lib/bio/fd_open.c index a5fce97bbaf..5ab9f78c48b 100644 --- a/src/lib/bio/fd_open.c +++ b/src/lib/bio/fd_open.c @@ -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));