]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix 'Dereference of null pointer' from scan-build-10
authorOndřej Surý <ondrej@isc.org>
Wed, 25 Mar 2020 16:25:45 +0000 (17:25 +0100)
committerOndřej Surý <ondrej@isc.org>
Wed, 25 Mar 2020 16:33:22 +0000 (17:33 +0100)
These are mostly false positives, the clang-analyzer FAQ[1] specifies
why and how to fix it:

> The reason the analyzer often thinks that a pointer can be null is
> because the preceding code checked compared it against null. So if you
> are absolutely sure that it cannot be null, remove the preceding check
> and, preferably, add an assertion as well.

The 4 warnings reported are:

dnssec-cds.c:781:4: warning: Access to field 'base' results in a dereference of a null pointer (loaded from variable 'buf')
                        isc_buffer_availableregion(buf, &r);
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/builds/isc-projects/bind9/lib/isc/include/isc/buffer.h:996:36: note: expanded from macro 'isc_buffer_availableregion'
                                   ^
/builds/isc-projects/bind9/lib/isc/include/isc/buffer.h:821:16: note: expanded from macro 'ISC__BUFFER_AVAILABLEREGION'
                (_r)->base = isc_buffer_used(_b);              \
                             ^~~~~~~~~~~~~~~~~~~
/builds/isc-projects/bind9/lib/isc/include/isc/buffer.h:152:29: note: expanded from macro 'isc_buffer_used'
        ((void *)((unsigned char *)(b)->base + (b)->used)) /*d*/
                                   ^~~~~~~~~
1 warning generated.

--

byname_test.c:308:34: warning: Access to field 'fwdtable' results in a dereference of a null pointer (loaded from variable 'view')
                RUNTIME_CHECK(dns_fwdtable_add(view->fwdtable, dns_rootname,
                                               ^~~~~~~~~~~~~~
/builds/isc-projects/bind9/lib/isc/include/isc/util.h:318:52: note: expanded from macro 'RUNTIME_CHECK'
                                                   ^~~~
/builds/isc-projects/bind9/lib/isc/include/isc/error.h:50:21: note: expanded from macro 'ISC_ERROR_RUNTIMECHECK'
        ((void)(ISC_LIKELY(cond) ||  \
                           ^~~~
/builds/isc-projects/bind9/lib/isc/include/isc/likely.h:23:43: note: expanded from macro 'ISC_LIKELY'
                                            ^
1 warning generated.

--

./rndc.c:255:6: warning: Dereference of null pointer (loaded from variable 'host')
        if (*host == '/') {
            ^~~~~
1 warning generated.

--

./main.c:1254:9: warning: Access to field 'sctx' results in a dereference of a null pointer (loaded from variable 'named_g_server')
        sctx = named_g_server->sctx;
               ^~~~~~~~~~~~~~~~~~~~
1 warning generated.

References:
1. https://clang-analyzer.llvm.org/faq.html#null_pointer

bin/dnssec/dnssec-cds.c
bin/named/main.c
bin/rndc/rndc.c
bin/tests/optional/byname_test.c

index e94235786cb06045b994a831a52c5410260d1e15..a9ba59d4f2ad189bf9b83b9cd3269bd08db8182f 100644 (file)
@@ -754,6 +754,8 @@ ds_from_cds(dns_rdatalist_t *dslist, isc_buffer_t *buf, dns_rdata_t *cds) {
        dns_rdata_ds_t ds;
        dns_rdata_t *rdata;
 
+       REQUIRE(buf != NULL);
+
        rdata = rdata_get();
 
        result = dns_rdata_tostruct(cds, &ds, NULL);
@@ -772,6 +774,8 @@ ds_from_cdnskey(dns_rdatalist_t *dslist, isc_buffer_t *buf,
        isc_result_t result;
        unsigned i, n;
 
+       REQUIRE(buf != NULL);
+
        n = sizeof(dtype) / sizeof(dtype[0]);
        for (i = 0; i < n; i++) {
                if (dtype[i] != 0) {
index 19875e2ce883d186fd91cd14f54db035dd419db5..ec8d22100f905655c5901ab99eed6c654f818c78 100644 (file)
@@ -1251,6 +1251,7 @@ setup(void) {
 #endif /* if CONTRIB_DLZ */
 
        named_server_create(named_g_mctx, &named_g_server);
+       ENSURE(named_g_server != NULL);
        sctx = named_g_server->sctx;
 
        /*
index b6e7a186647b02ac1406e810342c722950627123..f238b1d58407091a3d5c7081511a5be31dc5115a 100644 (file)
@@ -252,6 +252,8 @@ get_addresses(const char *host, in_port_t port) {
        isc_result_t result;
        int found = 0, count;
 
+       REQUIRE(host != NULL);
+
        if (*host == '/') {
                result = isc_sockaddr_frompath(&serveraddrs[nserveraddrs],
                                               host);
@@ -1036,7 +1038,7 @@ main(int argc, char **argv) {
                fatal("'%s' is not implemented", command);
        }
 
-       if (nserveraddrs == 0) {
+       if (nserveraddrs == 0 && servername != NULL) {
                get_addresses(servername, (in_port_t)remoteport);
        }
 
index a80160a69005456f091ed21b75f1e8722fa89c97..1d6ab599c1e43dc989a287afd1b080ac25acc1f4 100644 (file)
@@ -305,6 +305,7 @@ main(int argc, char *argv[]) {
                isc_sockaddr_fromin(&sa, &ina, 53);
                ISC_LIST_APPEND(sal, &sa, link);
 
+               REQUIRE(DNS_VIEW_VALID(view));
                RUNTIME_CHECK(dns_fwdtable_add(view->fwdtable, dns_rootname,
                                               &sal, dns_fwdpolicy_only) ==
                              ISC_R_SUCCESS);