listen: Retrieve configuration pairs once
authorNikolai Kondrashov <Nikolai.Kondrashov@redhat.com>
Tue, 9 Sep 2014 11:57:12 +0000 (14:57 +0300)
committerNikolai Kondrashov <Nikolai.Kondrashov@redhat.com>
Tue, 9 Sep 2014 15:06:27 +0000 (18:06 +0300)
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

index c98606d..55e3f86 100644 (file)
@@ -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");