From e431472f4db2998aef52084ccf906e07e8eec2e7 Mon Sep 17 00:00:00 2001 From: Nikolai Kondrashov Date: Tue, 9 Sep 2014 14:57:12 +0300 Subject: [PATCH] listen: Retrieve configuration pairs once Retrieve configuration pairs with cf_pair_find only once, before checking their existence, in common_socket_parse. This avoids ambiguity confusing Coverity, which otherwise reports the following issue. Error: NULL_RETURNS (CWE-476): freeradius-server-3.0.4rc2/src/main/listen.c:1139: returned_null: Function "cf_pair_find(CONF_SECTION const *, char const *)" returns null (checked 51 out of 54 times). freeradius-server-3.0.4rc2/src/main/conffile.c:2353:20: return_null: Explicitly returning null. freeradius-server-3.0.4rc2/src/main/client.c:514: example_checked: Example 1: "cf_pair_find(cs, "ipaddr")" has its value checked in "cf_pair_find(cs, "ipaddr")". freeradius-server-3.0.4rc2/src/main/conffile.c:667: example_assign: Example 2: Assigning: "cp" = return value from "cf_pair_find(cs, p)". freeradius-server-3.0.4rc2/src/main/conffile.c:668: example_checked: Example 2 (cont.): "cp" has its value checked in "cp". freeradius-server-3.0.4rc2/src/main/command.c:1556: example_assign: Example 3: Assigning: "cp" = return value from "cf_pair_find(mi->cs, argv[1])". freeradius-server-3.0.4rc2/src/main/command.c:1557: example_checked: Example 3 (cont.): "cp" has its value checked in "cp". freeradius-server-3.0.4rc2/src/main/listen.c:103: example_assign: Example 4: Assigning: "cp" = return value from "cf_pair_find(request->listener->cs, fmt)". freeradius-server-3.0.4rc2/src/main/listen.c:104: example_checked: Example 4 (cont.): "cp" has its value checked in "cp". freeradius-server-3.0.4rc2/src/main/mainconfig.c:345: example_assign: Example 5: Assigning: "cp" = return value from "cf_pair_find(request->client->cs, fmt)". freeradius-server-3.0.4rc2/src/main/mainconfig.c:346: example_checked: Example 5 (cont.): "cp" has its value checked in "cp". freeradius-server-3.0.4rc2/src/main/listen.c:1139: var_assigned: Assigning: "cp" = null return value from "cf_pair_find(CONF_SECTION const *, char const *)". freeradius-server-3.0.4rc2/src/main/listen.c:1142: dereference: Dereferencing a pointer that might be null "cp" when calling "cf_log_err_cp(CONF_PAIR const *, char const *, ...)". freeradius-server-3.0.4rc2/src/main/conffile.c:2930:2: deref_parm: Directly dereferencing parameter "cp". --- src/main/listen.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/listen.c b/src/main/listen.c index c98606d..55e3f86 100644 --- a/src/main/listen.c +++ b/src/main/listen.c @@ -904,6 +904,7 @@ int common_socket_parse(CONF_SECTION *cs, rad_listen_t *this) char const *section_name = NULL; CONF_SECTION *client_cs, *parentcs; CONF_SECTION *subcs; + CONF_PAIR *cp; this->cs = cs; @@ -1111,12 +1112,9 @@ int common_socket_parse(CONF_SECTION *cs, rad_listen_t *this) * If we can bind to interfaces, do so, * else don't. */ - if (cf_pair_find(cs, "interface")) { - char const *value; - CONF_PAIR *cp = cf_pair_find(cs, "interface"); - - rad_assert(cp != NULL); - value = cf_pair_value(cp); + cp = cf_pair_find(cs, "interface"); + if (cp) { + char const *value = cf_pair_value(cp); if (!value) { cf_log_err_cs(cs, "No interface name given"); @@ -1129,23 +1127,20 @@ int common_socket_parse(CONF_SECTION *cs, rad_listen_t *this) /* * If we can do broadcasts.. */ - if (cf_pair_find(cs, "broadcast")) { + cp = cf_pair_find(cs, "broadcast"); + if (cp) { #ifndef SO_BROADCAST cf_log_err_cs(cs, "System does not support broadcast sockets. Delete this line from the configuration file"); return -1; #else - char const *value; - CONF_PAIR *cp = cf_pair_find(cs, "broadcast"); - if (this->type != RAD_LISTEN_DHCP) { cf_log_err_cp(cp, "Broadcast can only be set for DHCP listeners. Delete this line from the configuration file"); return -1; } - rad_assert(cp != NULL); - value = cf_pair_value(cp); + char const *value = cf_pair_value(cp); if (!value) { cf_log_err_cs(cs, "No broadcast value given"); -- 2.1.4