summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Add snooping of DHCPv6 prefix delegation to the DHCP-relay function.dhcpv6-snoopSimon Kelley2021-12-308-13/+175
|
* Fix wrong client address for dhcp-script when DHCPv4 relay in use.Simon Kelley2021-12-261-3/+3
|
* Fix rare "Internal error in cache" messages.Simon Kelley2021-12-241-1/+1
| | | | | | | | | | | | | | | | Fix error created in 1ce1c6beae9f683bec54cba4c0d375f85b209b95 Many thanks to Hartmut Birr for finding the bug and bisecting to the guilty commit. The breaking commit creates cache entries which have F_NXDOMAIN set but none of F_IPV4, F_IPV6 or F_SRV. If cache_scan_free() is called to delete such an entry it will fail to do so. If the cache has no free slots and the least-recently-used slot is such an entry, then a new insertion will attempt to make space by calling cache_scan_free(), which will fail when it should be impossible and trigger the internal error.
* Generalise --dhcp-relay.Simon Kelley2021-12-206-25/+101
| | | | | | Sending via broadcast/multicast is now supported for both IPv4 and IPv6 and the configuration syntax made easier (but backwards compatible).
* Fix regression in --rebind-domain-ok in 2.86Simon Kelley2021-12-081-2/+11
| | | | | | | | | | | | | | The 2.86 domain-match rewrite changed matching from whole-labels to substring matching, so example.com would match example.com and www.example.com, as before, but also goodexample.com, which is a regression. This restores the original behaviour. Also restore the behaviour of --rebind-domain-ok=// to match domains with onlt a single label and no dots. Thanks to Sung Pae for reporting these bugs and supplying an initial patch.
* Correctly return a heap-allocated empty string instead of NULLguns2021-12-041-1/+1
| | | | | | | | | | | | | | | | | | | | | Commit 32e15c3f458c2e8838a9ecf7d478ecb6750516bf added the following change: --- a/src/option.c +++ b/src/option.c @@ -654,7 +654,7 @@ static char *canonicalise_opt(char *s) return 0; if (strlen(s) == 0) - return ""; + return opt_string_alloc(""); unhide_metas(s); if (!(ret = canonicalise(s, &nomem)) && nomem) Unfortunately, opt_string_alloc(const char *cp) returns NULL when strlen(cp) == 0, which in turn causes --rebind-domain-ok='' to crash with SIGSEGV.
* Fix confusion with log-IDs and DNS retries.Simon Kelley2021-12-011-7/+11
| | | | | | | | | | | | | | | | | | | | | | The IDs logged when --log-queries=extra is in effect can be wrong in three cases. 1) When query is retried in response to a a SERVFAIL or REFUSED answer from upstream. In this case the ID of an unrelated query will appear in the answer log lines. 2) When the same query arrives from two clients. The query is sent upstream once, as designed, and the result returned to both clients, as designed, but the reply to the first client gets the log-ID of the second query in error. 3) When a query arrives, is sent upstream, and the reply comes back, but the transaction is blocked awaiting a DNSSEC query needed to validate the reply. If the client retries the query in this state, the blocking DNSSEC query will be resent, as designed, but that send will be logged with the ID of the original, currently blocked, query. Thanks to Dominik Derigs for his analysis of this problem.
* Fix problems with upper-case in domain-match.Simon Kelley2021-11-284-6/+15
| | | | | | | | | The domain-match rewrite didn't take into account that domain names are case-insensitive, so things like --address=/Example.com/..... didn't work correctly.
* Fix crash in PXE/netboot when DNS server disabled.Simon Kelley2021-10-193-5/+12
|
* Add --filter and --filter-AAAA options.Simon Kelley2021-10-077-19/+67
|
* dnsmasq.h has to be included first as it sources config.hv2.87test4Dominik Derigs2021-10-071-1/+3
| | | | Signed-off-by: DL6ER <dl6er@dl6er.de>
* Support IDN in --auth-zone.Simon Kelley2021-10-061-2/+4
|
* Disable transitional IDN rules, accept only sane namesPetr Menšík2021-10-061-2/+0
| | | | | | | | | | Transitional encoding accepts every emoticon you can think about. Because setlocale were not enabled before, IDN 2003 input was not accepted by dnsmasq. It makes no sense therefore to maintain backward compatibility. Accept only proper encoded unicode names and reject random unicode characters. Signed-off-by: Petr Menšík <pemensik@redhat.com>
* Enable locale support for IDN at startupPetr Menšík2021-10-061-1/+6
| | | | | | | | --address=/münchen.de/ is not accepted unless LOCALEDIR is defined on build. It is not by default. If LIBIDN1 or 2 is defined, call setlocale to initialize locale required to translate domains to ascii form. Signed-off-by: Petr Menšík <pemensik@redhat.com>
* Fix logic in add_update_server() to make optimisation actually optimise.Simon Kelley2021-10-061-1/+1
|
* Use host byte-order variable for answer counting.Simon Kelley2021-10-061-4/+5
|
* Fix crash after re-reading an empty resolv.conf file.Simon Kelley2021-10-061-0/+5
| | | | | | | | | | | If dnsmasq re-reads a resolv file, and it's empty, it will retry after a delay. In the meantime, the old servers from the resolv file have been deleted, but the servers_array doesn't get updated, leading to dangling pointers and crashes. Thanks to Brad Jorsch for finding and analysing this bug. This problem was introduced in 2.86.
* Fix truncation logic in make_local_answer()Simon Kelley2021-10-051-5/+4
| | | | | | | add_resource_record() returns 1 if the record was added. Only increment anscount of so. Thanks to Petr Menšík for spotting the problem.
* Man page tweak for --address and more than one address.Simon Kelley2021-10-051-3/+1
|
* --local should behave as --server, not as --address according to the man pageDL6ER2021-10-051-2/+2
| | | | Signed-off-by: DL6ER <dl6er@dl6er.de>
* remove stale contrib/SuseOlaf Hering2021-09-305-246/+0
| | | | | | dnsmasq is included in SUSE Linux since 2004. Signed-off-by: Olaf Hering <olaf@aepfle.de>
* Do not fail hard when rev-server has a non-zero final address partv2.87test3Dominik Derigs2021-09-301-13/+5
| | | | Signed-off-by: DL6ER <dl6er@dl6er.de>
* Get compilation flags for libnftables from pkg-config.Simon Kelley2021-09-291-4/+5
| | | | Omission spotted by Olaf Hering. Thanks.
* dnsmasq_time: avoid signed integer overflow when HAVE_BROKEN_RTCMatt Whitlock2021-09-291-5/+4
| | | | | | | | | | | | | | | | | | | | | | The dnsmasq_time() function, in the case of HAVE_BROKEN_RTC, was calling times() to read the number of ticks "elapsed since an arbitrary point in the past" and then dividing that by sysconf(_SC_CLK_TCK) to compute the number of seconds elapsed since that arbitrary instant. This works fine until the number of ticks exceeds 2^31, beyond which time the function would begin erroneously returning negative times. On my system this happens after approximately 248 days of uptime. A symptom is that dnsmasq no longer populates the resolver cache with DHCP-derived names at startup, as the inserted cache entries immediately expire due to having negative expiration times that cause is_expired() to return true when called with now==0. This commit replaces the archaic implementation of dnsmasq_time() with a call to the POSIX-standardized clock_gettime(CLOCK_MONOTONIC), thereby eliminating the need to convert manually from ticks to seconds. The new implementation will yield correct results until the system uptime exceeds approximately 68 years. Signed-off-by: Matt Whitlock <dnsmasq@mattwhitlock.name>
* Fix FTBFS when CONNTRACK and UBUS but not DNSSEC compile options selected.Simon Kelley2021-09-281-1/+4
|
* Build Debian binaries with NFTset support.Simon Kelley2021-09-274-1/+7
|
* Fix confusion in DNS retries and --strict-order.Simon Kelley2021-09-271-4/+16
| | | | | | | | Behaviour to stop infinite loops when all servers return REFUSED was wrongly activated on client retries, resulting in incorrect REFUSED replies to client retries. Thanks to Johannes Stezenbach for finding the problem.
* Add --nftset option, like --ipset but for the newer nftables.v2.87test2Simon Kelley2021-09-2712-45/+226
| | | | | Thanks to Chen Zhenge for the original patch, which I've reworked. Any bugs down to SRK.
* Make --rebind-domain-ok work with IDN.Simon Kelley2021-09-243-9/+14
|
* manpage: clarify tags: semantics for --dhcp-hostPaul Fertser2021-09-241-2/+5
| | | | | | Mention that several tags can be specified and instruct the user that some other match must still be provided for the directive to have any effect.
* Improve last patch by splitting the previously combined ifDominik Derigs2021-09-231-2/+9
| | | | | | | Signed-off-by: DL6ER <dl6er@dl6er.de> (also cosmetic change to logging for improved translation from Matthias Andree <matthias.andree@gmx.de>)
* Correcly warn if dynamic directory is actually no directoryDominik Derigs2021-09-231-1/+1
| | | | Signed-off-by: DL6ER <dl6er@dl6er.de>
* Fix --address=/#/...... which was lost in 2.86Simon Kelley2021-09-233-6/+22
| | | | A victim of the domain-search rewrite. Apologies.
* Check if allocation of 66573 bytes succeeded before accessing the memory to ↵Dominik DL6ER2021-09-201-1/+1
| | | | | | avoid crash in busy times Signed-off-by: DL6ER <dl6er@dl6er.de>
* Optimize inserting records into server list.hev2021-09-202-10/+9
| | | | Signed-off-by: hev <r@hev.cc>
* Thinko in immediately previous commit.Simon Kelley2021-09-201-1/+1
|
* Add support for arbitrary prefix lengths in --rev-server and --domain=....,localSimon Kelley2021-09-203-71/+139
| | | | | | | | | Previously, the prefix was limited to [8,16,24,32] for IPv4 and to multiples of 4 for IPv6. This patch also makes the prefix-length optional for --rev-server. Inspired by a patch from DL6ER <dl6er@dl6er.de>, but completely re-written by srk. All bugs are his.
* Fix confusion is server=/domain/# combined with server|address=/domain/....Simon Kelley2021-09-182-72/+75
| | | | | | | | | | | | | | | | | | | The 2.86 domain matching rewrite failed to take into account the possibilty that server=/example.com/# could be combined with, for example address=/example.com/1.2.3.4 resulting in the struct server datastructure for the former getting passed to forward_query(), rapidly followed by a SEGV. This fix makes server=/example.com/# a fully fledged member of the priority list, which is now IPv6 addr, IPv4 addr, all zero return, resolvconf servers, upstream servers, no-data return Thanks to dl6er@dl6er.de for finding and characterising the bug.
* Fix coverity issues in dnssec.cPetr Menšík2021-09-111-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: CHECKED_RETURN (CWE-252): [#def26] dnsmasq-2.86rc3/src/dnssec.c:727: check_return: Calling "extract_name" without checking return value (as is done elsewhere 9 out of 10 times). dnsmasq-2.86rc3/src/dnssec.c:459: example_checked: Example 1: "extract_name(header, plen, &p, keyname, 1, 0)" has its value checked in "extract_name(header, plen, &p, keyname, 1, 0)". dnsmasq-2.86rc3/src/dnssec.c:269: example_checked: Example 2: "extract_name(header, plen, &state->ip, state->buff, 1, 0)" has its value checked in "extract_name(header, plen, &state->ip, state->buff, 1, 0)". dnsmasq-2.86rc3/src/dnssec.c:569: example_checked: Example 3: "extract_name(header, plen, &p, keyname, 1, 0)" has its value checked in "extract_name(header, plen, &p, keyname, 1, 0)". dnsmasq-2.86rc3/src/rfc1035.c:648: example_checked: Example 4: "extract_name(header, qlen, &p1, name, 1, 0)" has its value checked in "extract_name(header, qlen, &p1, name, 1, 0)". dnsmasq-2.86rc3/src/rfc1035.c:787: example_checked: Example 5: "extract_name(header, qlen, &p1, name, 1, 0)" has its value checked in "extract_name(header, qlen, &p1, name, 1, 0)". # 725| /* namebuff used for workspace above, restore to leave unchanged on exit */ # 726| p = (unsigned char*)(rrset[0]); # 727|-> extract_name(header, plen, &p, name, 1, 0); # 728| # 729| if (key) Error: CHECKED_RETURN (CWE-252): [#def27] dnsmasq-2.86rc3/src/dnssec.c:1020: check_return: Calling "extract_name" without checking return value (as is done elsewhere 7 out of 8 times). dnsmasq-2.86rc3/src/auth.c:140: example_checked: Example 1: "extract_name(header, qlen, &p, name, 1, 4)" has its value checked in "extract_name(header, qlen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/dnssec.c:771: example_checked: Example 2: "extract_name(header, plen, &p, name, 1, 4)" has its value checked in "extract_name(header, plen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/hash-questions.c:57: example_checked: Example 3: "extract_name(header, plen, &p, name, 1, 4)" has its value checked in "extract_name(header, plen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/rfc1035.c:1028: example_checked: Example 4: "extract_name(header, qlen, &p, name, 1, 4)" has its value checked in "extract_name(header, qlen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/rfc1035.c:1438: example_checked: Example 5: "extract_name(header, qlen, &p, name, 1, 4)" has its value checked in "extract_name(header, qlen, &p, name, 1, 4)". # 1018| # 1019| p = (unsigned char *)(header+1); # 1020|-> extract_name(header, plen, &p, name, 1, 4); # 1021| p += 4; /* qtype, qclass */ # 1022|
* Fix coverity detected issues in dnsmasq.cPetr Menšík2021-09-111-4/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: DEADCODE (CWE-561): [#def12] dnsmasq-2.86rc3/src/dnsmasq.c:37: assignment: Assigning: "bind_fallback" = "0". dnsmasq-2.86rc3/src/dnsmasq.c:927: const: At condition "bind_fallback", the value of "bind_fallback" must be equal to 0. dnsmasq-2.86rc3/src/dnsmasq.c:927: dead_error_condition: The condition "bind_fallback" cannot be true. dnsmasq-2.86rc3/src/dnsmasq.c:928: dead_error_line: Execution cannot reach this statement: "my_syslog(4, "setting --bin...". dnsmasq-2.86rc3/src/dnsmasq.c:928: effectively_constant: Local variable "bind_fallback" is assigned only once, to a constant value, making it effectively constant throughout its scope. If this is not the intent, examine the logic to see if there is a missing assignment that would make "bind_fallback" not remain constant. # 926| # 927| if (bind_fallback) # 928|-> my_syslog(LOG_WARNING, _("setting --bind-interfaces option because of OS limitations")); # 929| # 930| if (option_bool(OPT_NOWILD)) Error: REVERSE_NEGATIVE (CWE-191): [#def13] dnsmasq-2.86rc3/src/dnsmasq.c:383: negative_sink_in_call: Passing "dnsmasq_daemon->pxefd" to a parameter that cannot be negative. dnsmasq-2.86rc3/src/dnsmasq.c:1086: check_after_sink: You might be using variable "dnsmasq_daemon->pxefd" before verifying that it is >= 0. # 1084| { # 1085| poll_listen(daemon->dhcpfd, POLLIN); # 1086|-> if (daemon->pxefd != -1) # 1087| poll_listen(daemon->pxefd, POLLIN); # 1088| } Error: CHECKED_RETURN (CWE-252): [#def18] dnsmasq-2.86rc3/src/dnsmasq.c:1582: check_return: Calling "fcntl(dnsmasq_daemon->helperfd, 4, i & 0xfffffffffffff7ff)" without checking return value. This library function may fail and return an error code. # 1580| /* block in writes until all done */ # 1581| if ((i = fcntl(daemon->helperfd, F_GETFL)) != -1) # 1582|-> fcntl(daemon->helperfd, F_SETFL, i & ~O_NONBLOCK); # 1583| do { # 1584| helper_write(); Error: CHECKED_RETURN (CWE-252): [#def22] dnsmasq-2.86rc3/src/dnsmasq.c:1991: check_return: Calling "fcntl(confd, 4, flags & 0xfffffffffffff7ff)" without checking return value. This library function may fail and return an error code. # 1989| Reset that here. */ # 1990| if ((flags = fcntl(confd, F_GETFL, 0)) != -1) # 1991|-> fcntl(confd, F_SETFL, flags & ~O_NONBLOCK); # 1992| # 1993| buff = tcp_request(confd, now, &tcp_addr, netmask, auth_dns); Error: CHECKED_RETURN (CWE-252): [#def26] dnsmasq-2.86rc3/src/dnssec.c:727: check_return: Calling "extract_name" without checking return value (as is done elsewhere 9 out of 10 times). dnsmasq-2.86rc3/src/dnssec.c:459: example_checked: Example 1: "extract_name(header, plen, &p, keyname, 1, 0)" has its value checked in "extract_name(header, plen, &p, keyname, 1, 0)". dnsmasq-2.86rc3/src/dnssec.c:269: example_checked: Example 2: "extract_name(header, plen, &state->ip, state->buff, 1, 0)" has its value checked in "extract_name(header, plen, &state->ip, state->buff, 1, 0)". dnsmasq-2.86rc3/src/dnssec.c:569: example_checked: Example 3: "extract_name(header, plen, &p, keyname, 1, 0)" has its value checked in "extract_name(header, plen, &p, keyname, 1, 0)". dnsmasq-2.86rc3/src/rfc1035.c:648: example_checked: Example 4: "extract_name(header, qlen, &p1, name, 1, 0)" has its value checked in "extract_name(header, qlen, &p1, name, 1, 0)". dnsmasq-2.86rc3/src/rfc1035.c:787: example_checked: Example 5: "extract_name(header, qlen, &p1, name, 1, 0)" has its value checked in "extract_name(header, qlen, &p1, name, 1, 0)". # 725| /* namebuff used for workspace above, restore to leave unchanged on exit */ # 726| p = (unsigned char*)(rrset[0]); # 727|-> extract_name(header, plen, &p, name, 1, 0); # 728| # 729| if (key) Error: CHECKED_RETURN (CWE-252): [#def27] dnsmasq-2.86rc3/src/dnssec.c:1020: check_return: Calling "extract_name" without checking return value (as is done elsewhere 7 out of 8 times). dnsmasq-2.86rc3/src/auth.c:140: example_checked: Example 1: "extract_name(header, qlen, &p, name, 1, 4)" has its value checked in "extract_name(header, qlen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/dnssec.c:771: example_checked: Example 2: "extract_name(header, plen, &p, name, 1, 4)" has its value checked in "extract_name(header, plen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/hash-questions.c:57: example_checked: Example 3: "extract_name(header, plen, &p, name, 1, 4)" has its value checked in "extract_name(header, plen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/rfc1035.c:1028: example_checked: Example 4: "extract_name(header, qlen, &p, name, 1, 4)" has its value checked in "extract_name(header, qlen, &p, name, 1, 4)". dnsmasq-2.86rc3/src/rfc1035.c:1438: example_checked: Example 5: "extract_name(header, qlen, &p, name, 1, 4)" has its value checked in "extract_name(header, qlen, &p, name, 1, 4)". # 1018| # 1019| p = (unsigned char *)(header+1); # 1020|-> extract_name(header, plen, &p, name, 1, 4); # 1021| p += 4; /* qtype, qclass */ # 1022|
* Fix coverity issues detected in domain-match.cPetr Menšík2021-09-111-3/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: CHECKED_RETURN (CWE-252): [#def28] dnsmasq-2.86rc3/src/domain-match.c:414: check_return: Calling "add_resource_record" without checking return value (as is done elsewhere 44 out of 46 times). dnsmasq-2.86rc3/src/auth.c:214: example_checked: Example 1: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", intr->name)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", intr->name)". dnsmasq-2.86rc3/src/auth.c:239: example_checked: Example 2: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", name)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", name)". dnsmasq-2.86rc3/src/rfc1035.c:1463: example_checked: Example 3: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, crec_ttl(crecp, now), &nameoffset, 5, 1, "d", cname_target)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, crec_ttl(crecp, now), &nameoffset, 5, 1, "d", cname_target)". dnsmasq-2.86rc3/src/rfc1035.c:1500: example_checked: Example 4: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, ttl, NULL, 16, t->class, "t", t->len, t->txt)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, ttl, NULL, 16, t->class, "t", t->len, t->txt)". dnsmasq-2.86rc3/src/rfc1035.c:2021: example_checked: Example 5: "add_resource_record(header, limit, NULL, rec->offset, &ansp, crec_ttl(crecp, now), NULL, type, 1, ((crecp->flags & 0x80U) ? "4" : "6"), &crecp->addr)" has its value checked in "add_resource_record(header, limit, NULL, rec->offset, &ansp, crec_ttl(crecp, now), NULL, type, 1, ((crecp->flags & 0x80U) ? "4" : "6"), &crecp->addr)". # 412| # 413| header->ancount = htons(ntohs(header->ancount) + 1); # 414|-> add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_A, C_IN, "4", &addr); # 415| log_query((flags | F_CONFIG | F_FORWARD) & ~F_IPV6, name, (union all_addr *)&addr, NULL); # 416| } Error: CHECKED_RETURN (CWE-252): [#def29] dnsmasq-2.86rc3/src/domain-match.c:429: check_return: Calling "add_resource_record" without checking return value (as is done elsewhere 44 out of 46 times). dnsmasq-2.86rc3/src/auth.c:214: example_checked: Example 1: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", intr->name)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", intr->name)". dnsmasq-2.86rc3/src/auth.c:239: example_checked: Example 2: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", name)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, dnsmasq_daemon->auth_ttl, NULL, 12, 1, "d", name)". dnsmasq-2.86rc3/src/rfc1035.c:1463: example_checked: Example 3: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, crec_ttl(crecp, now), &nameoffset, 5, 1, "d", cname_target)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, crec_ttl(crecp, now), &nameoffset, 5, 1, "d", cname_target)". dnsmasq-2.86rc3/src/rfc1035.c:1500: example_checked: Example 4: "add_resource_record(header, limit, &trunc, nameoffset, &ansp, ttl, NULL, 16, t->class, "t", t->len, t->txt)" has its value checked in "add_resource_record(header, limit, &trunc, nameoffset, &ansp, ttl, NULL, 16, t->class, "t", t->len, t->txt)". dnsmasq-2.86rc3/src/rfc1035.c:2021: example_checked: Example 5: "add_resource_record(header, limit, NULL, rec->offset, &ansp, crec_ttl(crecp, now), NULL, type, 1, ((crecp->flags & 0x80U) ? "4" : "6"), &crecp->addr)" has its value checked in "add_resource_record(header, limit, NULL, rec->offset, &ansp, crec_ttl(crecp, now), NULL, type, 1, ((crecp->flags & 0x80U) ? "4" : "6"), &crecp->addr)". # 427| # 428| header->ancount = htons(ntohs(header->ancount) + 1); # 429|-> add_resource_record(header, limit, &trunc, sizeof(struct dns_header), &p, daemon->local_ttl, NULL, T_AAAA, C_IN, "6", &addr); # 430| log_query((flags | F_CONFIG | F_FORWARD) & ~F_IPV4, name, (union all_addr *)&addr, NULL); # 431| } Error: NULL_RETURNS (CWE-476): [#def30] dnsmasq-2.86rc3/src/domain-match.c:611: returned_null: "whine_malloc" returns "NULL" (checked 72 out of 76 times). dnsmasq-2.86rc3/src/domain-match.c:611: var_assigned: Assigning: "alloc_domain" = "NULL" return value from "whine_malloc". dnsmasq-2.86rc3/src/domain-match.c:620: dereference: Dereferencing a pointer that might be "NULL" "alloc_domain" when calling "hostname_isequal". dnsmasq-2.86rc3/src/arp.c:88: example_checked: Example 1: "whine_malloc(48UL)" has its value checked in "arp = whine_malloc(48UL)". dnsmasq-2.86rc3/src/blockdata.c:24: example_assign: Example 2: Assigning: "new" = return value from "whine_malloc(n * 48UL)". dnsmasq-2.86rc3/src/blockdata.c:26: example_checked: Example 2 (cont.): "new" has its value checked in "new". dnsmasq-2.86rc3/src/cache.c:1545: example_assign: Example 3: Assigning: "crecp" = return value from "whine_malloc(70UL)". dnsmasq-2.86rc3/src/cache.c:1547: example_checked: Example 3 (cont.): "crecp" has its value checked in "crecp". dnsmasq-2.86rc3/src/forward.c:1791: example_assign: Example 4: Assigning: "packet" = return value from "whine_malloc(66573UL)". dnsmasq-2.86rc3/src/forward.c:1795: example_checked: Example 4 (cont.): "packet" has its value checked in "packet". dnsmasq-2.86rc3/src/inotify.c:186: example_checked: Example 5: "whine_malloc(lendir + lenfile + 2UL)" has its value checked in "path = whine_malloc(lendir + lenfile + 2UL)". # 618| if (flags & SERV_IS_LOCAL) # 619| for (serv = daemon->servers; serv; serv = serv->next) # 620|-> if ((serv->flags & SERV_MARK) && # 621| hostname_isequal(alloc_domain, serv->domain)) # 622| break; Error: RESOURCE_LEAK (CWE-772): [#def31] [important] dnsmasq-2.86rc3/src/domain-match.c:611: alloc_fn: Storage is returned from allocation function "whine_malloc". dnsmasq-2.86rc3/src/domain-match.c:611: var_assign: Assigning: "alloc_domain" = storage returned from "whine_malloc(1UL)". dnsmasq-2.86rc3/src/domain-match.c:620: noescape: Resource "alloc_domain" is not freed or pointed-to in "hostname_isequal". dnsmasq-2.86rc3/src/domain-match.c:646: leaked_storage: Variable "alloc_domain" going out of scope leaks the storage it points to. # 644| # 645| if (!(serv = whine_malloc(size))) # 646|-> return 0; # 647| # 648| if (flags & SERV_IS_LOCAL) Error: NULL_RETURNS (CWE-476): [#def32] dnsmasq-2.86rc3/src/domain-match.c:611: returned_null: "whine_malloc" returns "NULL" (checked 72 out of 76 times). dnsmasq-2.86rc3/src/domain-match.c:611: var_assigned: Assigning: "alloc_domain" = "NULL" return value from "whine_malloc". dnsmasq-2.86rc3/src/domain-match.c:674: dereference: Dereferencing a pointer that might be "NULL" "alloc_domain" when calling "strlen". dnsmasq-2.86rc3/src/arp.c:88: example_checked: Example 1: "whine_malloc(48UL)" has its value checked in "arp = whine_malloc(48UL)". dnsmasq-2.86rc3/src/blockdata.c:24: example_assign: Example 2: Assigning: "new" = return value from "whine_malloc(n * 48UL)". dnsmasq-2.86rc3/src/blockdata.c:26: example_checked: Example 2 (cont.): "new" has its value checked in "new". dnsmasq-2.86rc3/src/cache.c:1545: example_assign: Example 3: Assigning: "crecp" = return value from "whine_malloc(70UL)". dnsmasq-2.86rc3/src/cache.c:1547: example_checked: Example 3 (cont.): "crecp" has its value checked in "crecp". dnsmasq-2.86rc3/src/forward.c:1791: example_assign: Example 4: Assigning: "packet" = return value from "whine_malloc(66573UL)". dnsmasq-2.86rc3/src/forward.c:1795: example_checked: Example 4 (cont.): "packet" has its value checked in "packet". dnsmasq-2.86rc3/src/inotify.c:186: example_checked: Example 5: "whine_malloc(lendir + lenfile + 2UL)" has its value checked in "path = whine_malloc(lendir + lenfile + 2UL)". # 672| serv->flags = flags; # 673| serv->domain = alloc_domain; # 674|-> serv->domain_len = strlen(alloc_domain); # 675| # 676| if (flags & SERV_4ADDR)
* Fix coverity detected issues in cache.cSimon Kelley2021-09-111-1/+2
| | | | | | | | | | | | | | | | | | | Error: UNINIT (CWE-457): [#def27] dnsmasq-2.86test7/src/cache.c:1193: var_decl: Declaring variable "lrec" without initializer. dnsmasq-2.86test7/src/cache.c:1315: uninit_use_in_call: Using uninitialized value "lrec.ttd" when calling "make_non_terminals". # 1313| { # 1314| lrec.name.namep = txt->name; # 1315|-> make_non_terminals(&lrec); # 1316| } # 1317| Error: CLANG_WARNING: [#def29] dnsmasq-2.86test7/src/cache.c:1552:15: warning[core.uninitialized.Assign]: Assigned value is garbage or undefined # 1550| { # 1551| crecp->flags = (source->flags | F_NAMEP) & ~(F_IPV4 | F_IPV6 | F_CNAME | F_SRV | F_DNSKEY | F_DS | F_REVERSE); # 1552|-> crecp->ttd = source->ttd; # 1553| crecp->name.namep = name; # 1554|
* Fix coverity detected issue in radv.cPetr Menšík2021-09-111-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: NULL_RETURNS (CWE-476): [#def114] dnsmasq-2.86test7/src/radv.c:748: returned_null: "expand" returns "NULL" (checked 10 out of 11 times). dnsmasq-2.86test7/src/radv.c:748: var_assigned: Assigning: "p" = "NULL" return value from "expand". dnsmasq-2.86test7/src/radv.c:749: dereference: Dereferencing a pointer that might be "NULL" "p" when calling "memset". [Note: The source code implementation of the function has been overridden by a builtin model.] dnsmasq-2.86test7/src/outpacket.c:83: example_checked: Example 1: "expand(len)" has its value checked in "p = expand(len)". dnsmasq-2.86test7/src/outpacket.c:109: example_checked: Example 2: "expand(1UL)" has its value checked in "p = expand(1UL)". dnsmasq-2.86test7/src/radv.c:269: example_checked: Example 3: "expand(16UL)" has its value checked in "ra = expand(16UL)". dnsmasq-2.86test7/src/radv.c:363: example_checked: Example 4: "expand(32UL)" has its value checked in "opt = expand(32UL)". dnsmasq-2.86test7/src/radv.c:708: example_checked: Example 5: "expand(32UL)" has its value checked in "opt = expand(32UL)". # 747| int len = (maclen + 9) >> 3; # 748| unsigned char *p = expand(len << 3); # 749|-> memset(p, 0, len << 3); # 750| *p++ = ICMP6_OPT_SOURCE_MAC; # 751| *p++ = len; Error: NULL_RETURNS (CWE-476): [#def115] dnsmasq-2.86test7/src/radv.c:748: returned_null: "expand" returns "NULL" (checked 10 out of 11 times). dnsmasq-2.86test7/src/radv.c:748: var_assigned: Assigning: "p" = "NULL" return value from "expand". dnsmasq-2.86test7/src/radv.c:750: dereference: Incrementing a pointer which might be null: "p". dnsmasq-2.86test7/src/outpacket.c:83: example_checked: Example 1: "expand(len)" has its value checked in "p = expand(len)". dnsmasq-2.86test7/src/outpacket.c:109: example_checked: Example 2: "expand(1UL)" has its value checked in "p = expand(1UL)". dnsmasq-2.86test7/src/radv.c:269: example_checked: Example 3: "expand(16UL)" has its value checked in "ra = expand(16UL)". dnsmasq-2.86test7/src/radv.c:363: example_checked: Example 4: "expand(32UL)" has its value checked in "opt = expand(32UL)". dnsmasq-2.86test7/src/radv.c:708: example_checked: Example 5: "expand(32UL)" has its value checked in "opt = expand(32UL)". # 748| unsigned char *p = expand(len << 3); # 749| memset(p, 0, len << 3); # 750|-> *p++ = ICMP6_OPT_SOURCE_MAC; # 751| *p++ = len; # 752| memcpy(p, mac, maclen);
* Fix coverity detected issues in option.cPetr Menšík2021-09-111-12/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: STRING_OVERFLOW (CWE-120): [#def99] dnsmasq-2.86test7/src/option.c:801: fixed_size_dest: You might overrun the 100-character fixed-size string "buff" by copying "usage[i].arg" without checking the length. # 799| if (usage[i].arg) # 800| { # 801|-> strcpy(buff, usage[i].arg); # 802| for (j = 0; tab[j].handle; j++) # 803| if (tab[j].handle == *(usage[i].arg)) Error: CLANG_WARNING: [#def100] dnsmasq-2.86test7/src/option.c:962:3: warning[deadcode.DeadStores]: Value stored to 'domain' is never read # 960| } # 961| # 962|-> domain += sprintf(domain, "in-addr.arpa"); # 963| # 964| return 1; Error: CLANG_WARNING: [#def101] dnsmasq-2.86test7/src/option.c:981:3: warning[deadcode.DeadStores]: Value stored to 'domain' is never read # 979| domain += sprintf(domain, "%.1x.", (i>>2) & 1 ? dig & 15 : dig >> 4); # 980| } # 981|-> domain += sprintf(domain, "ip6.arpa"); # 982| # 983| return 1; Error: RESOURCE_LEAK (CWE-772): [#def102] [important] dnsmasq-2.86test7/src/option.c:1809: alloc_fn: Storage is returned from allocation function "opt_malloc". dnsmasq-2.86test7/src/option.c:1809: var_assign: Assigning: "path" = storage returned from "opt_malloc(strlen(directory) + len + 2UL)". dnsmasq-2.86test7/src/option.c:1810: noescape: Resource "path" is not freed or pointed-to in "strcpy". [Note: The source code implementation of the function has been overridden by a builtin model.] dnsmasq-2.86test7/src/option.c:1811: noescape: Resource "path" is not freed or pointed-to in "strcat". [Note: The source code implementation of the function has been overridden by a builtin model.] dnsmasq-2.86test7/src/option.c:1812: noescape: Resource "path" is not freed or pointed-to in "strcat". [Note: The source code implementation of the function has been overridden by a builtin model.] dnsmasq-2.86test7/src/option.c:1815: noescape: Resource "path" is not freed or pointed-to in "stat". dnsmasq-2.86test7/src/option.c:1809: overwrite_var: Overwriting "path" in "path = opt_malloc(strlen(directory) + len + 2UL)" leaks the storage that "path" points to. # 1807| continue; # 1808| # 1809|-> path = opt_malloc(strlen(directory) + len + 2); # 1810| strcpy(path, directory); # 1811| strcat(path, "/"); Error: RESOURCE_LEAK (CWE-772): [#def103] [important] dnsmasq-2.86test7/src/option.c:1809: alloc_fn: Storage is returned from allocation function "opt_malloc". dnsmasq-2.86test7/src/option.c:1809: var_assign: Assigning: "path" = storage returned from "opt_malloc(strlen(directory) + len + 2UL)". dnsmasq-2.86test7/src/option.c:1810: noescape: Resource "path" is not freed or pointed-to in "strcpy". [Note: The source code implementation of the function has been overridden by a builtin model.] dnsmasq-2.86test7/src/option.c:1811: noescape: Resource "path" is not freed or pointed-to in "strcat". [Note: The source code implementation of the function has been overridden by a builtin model.] dnsmasq-2.86test7/src/option.c:1812: noescape: Resource "path" is not freed or pointed-to in "strcat". [Note: The source code implementation of the function has been overridden by a builtin model.] dnsmasq-2.86test7/src/option.c:1815: noescape: Resource "path" is not freed or pointed-to in "stat". dnsmasq-2.86test7/src/option.c:1858: leaked_storage: Variable "path" going out of scope leaks the storage it points to. # 1856| free(files); # 1857| } # 1858|-> break; # 1859| } # 1860| Error: RESOURCE_LEAK (CWE-772): [#def104] [important] dnsmasq-2.86test7/src/option.c:1996: alloc_fn: Storage is returned from allocation function "canonicalise_opt". dnsmasq-2.86test7/src/option.c:1996: var_assign: Assigning: "name" = storage returned from "canonicalise_opt(arg)". dnsmasq-2.86test7/src/option.c:1998: leaked_storage: Variable "name" going out of scope leaks the storage it points to. # 1996| if (!(name = canonicalise_opt(arg)) || # 1997| (comma && !(target = canonicalise_opt(comma)))) # 1998|-> ret_err(_("bad MX name")); # 1999| # 2000| new = opt_malloc(sizeof(struct mx_srv_record)); Error: RESOURCE_LEAK (CWE-772): [#def106] [important] dnsmasq-2.86test7/src/option.c:3477: alloc_fn: Storage is returned from allocation function "opt_malloc". dnsmasq-2.86test7/src/option.c:3477: var_assign: Assigning: "new" = storage returned from "opt_malloc(96UL)". dnsmasq-2.86test7/src/option.c:3618: leaked_storage: Variable "new" going out of scope leaks the storage it points to. # 3616| sprintf(errstr, _("duplicate dhcp-host IP address %s"), # 3617| daemon->addrbuff); # 3618|-> return 0; # 3619| } # 3620| } Error: RESOURCE_LEAK (CWE-772): [#def108] [important] dnsmasq-2.86test7/src/option.c:3781: alloc_fn: Storage is returned from allocation function "opt_malloc". dnsmasq-2.86test7/src/option.c:3781: var_assign: Assigning: "new" = storage returned from "opt_malloc(32UL)". dnsmasq-2.86test7/src/option.c:3786: leaked_storage: Variable "new" going out of scope leaks the storage it points to. # 3784| # 3785| if (!(comma = split(arg)) || (len = strlen(comma)) == 0) # 3786|-> ret_err(gen_err); # 3787| # 3788| new->wildcard = 0; Error: RESOURCE_LEAK (CWE-772): [#def109] [important] dnsmasq-2.86test7/src/option.c:3921: alloc_fn: Storage is returned from allocation function "opt_malloc". dnsmasq-2.86test7/src/option.c:3921: var_assign: Assigning: "new" = storage returned from "opt_malloc(56UL)". dnsmasq-2.86test7/src/option.c:3994: leaked_storage: Variable "new" going out of scope leaks the storage it points to. # 3992| } # 3993| # 3994|-> ret_err(gen_err); # 3995| } # 3996| Error: CLANG_WARNING: [#def111] dnsmasq-2.86test7/src/option.c:4693:25: warning[deadcode.DeadStores]: Value stored to 'tmp' during its initialization is never read # 4691| if (!canon) # 4692| { # 4693|-> struct name_list *tmp = new->names, *next; # 4694| for (tmp = new->names; tmp; tmp = next) # 4695|
* Address coverity issues detected in util.cPetr Menšík2021-09-111-2/+2
|
* Fix coverity warnings on dbusPetr Menšík2021-09-111-6/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: CLANG_WARNING: [#def30] dnsmasq-2.86test7/src/dbus.c:117:3: warning[deadcode.DeadStores]: Value stored to 'w' is never read # 115| daemon->watches = w; # 116| # 117|-> w = data; /* no warning */ # 118| return TRUE; # 119| } Error: CLANG_WARNING: [#def31] dnsmasq-2.86test7/src/dbus.c:137:3: warning[deadcode.DeadStores]: Value stored to 'w' is never read # 135| } # 136| # 137|-> w = data; /* no warning */ # 138| } # 139| Error: CHECKED_RETURN (CWE-252): [#def32] dnsmasq-2.86test7/src/dbus.c:146: check_return: Calling "dbus_message_iter_init" without checking return value (as is done elsewhere 4 out of 5 times). dnsmasq-2.86test7/src/dbus.c:460: example_checked: Example 1: "dbus_message_iter_init(message, &iter)" has its value checked in "dbus_message_iter_init(message, &iter)". dnsmasq-2.86test7/src/dbus.c:573: example_checked: Example 2: "dbus_message_iter_init(message, &iter)" has its value checked in "dbus_message_iter_init(message, &iter)". dnsmasq-2.86test7/src/dbus.c:257: example_checked: Example 3: "dbus_message_iter_init(message, &iter)" has its value checked in "dbus_message_iter_init(message, &iter)". dnsmasq-2.86test7/src/dbus.c:427: example_checked: Example 4: "dbus_message_iter_init(message, &iter)" has its value checked in "dbus_message_iter_init(message, &iter)". # 144| char *domain; # 145| # 146|-> dbus_message_iter_init(message, &iter); # 147| # 148| mark_servers(SERV_FROM_DBUS); Error: NEGATIVE_RETURNS (CWE-394): [#def33] dnsmasq-2.86test7/src/dbus.c:547: negative_return_fn: Function "parse_hex((char *)hwaddr, dhcp_chaddr, 16, NULL, &hw_type)" returns a negative number. dnsmasq-2.86test7/src/dbus.c:547: assign: Assigning: "hw_len" = "parse_hex((char *)hwaddr, dhcp_chaddr, 16, NULL, &hw_type)". dnsmasq-2.86test7/src/dbus.c:551: negative_returns: "hw_len" is passed to a parameter that cannot be negative. # 549| hw_type = ARPHRD_ETHER; # 550| # 551|-> lease_set_hwaddr(lease, dhcp_chaddr, clid, hw_len, hw_type, # 552| clid_len, now, 0); # 553| lease_set_expires(lease, expires, now); Error: CLANG_WARNING: [#def34] dnsmasq-2.86test7/src/dbus.c:722:3: warning[deadcode.DeadStores]: Value stored to 'method' is never read # 720| clear_cache_and_reload(dnsmasq_time()); # 721| # 722|-> method = user_data; /* no warning */ # 723| # 724| /* If no reply or no error, return nothing */
* Retry dhcp6 ping on interruptsPetr Menšík2021-09-111-1/+1
| | | | | | | | | | Error: CHECKED_RETURN (CWE-252): [#def35] dnsmasq-2.86test7/src/dhcp6.c:295: check_return: Calling "sendto(dnsmasq_daemon->icmp6fd, &neigh, 24UL, 0, __CONST_SOCKADDR_ARG({.__sockaddr__ = &addr.sa}), 28U)" without checking return value. This library function may fail and return an error code. # 293| break; # 294| # 295|-> sendto(daemon->icmp6fd, &neigh, sizeof(neigh), 0, &addr.sa, sizeof(addr)); # 296| # 297| ts.tv_sec = 0;
* Fix coverity formats issues in blockdataPetr Menšík2021-09-111-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | Error: PRINTF_ARGS (CWE-686): [#def16] dnsmasq-2.86test7/src/blockdata.c:56: invalid_type: Argument "blockdata_count * 48UL" to format specifier "%u" was expected to have type "unsigned int" but has type "unsigned long". # 54| { # 55| my_syslog(LOG_INFO, _("pool memory in use %u, max %u, allocated %u"), # 56|-> blockdata_count * sizeof(struct blockdata), # 57| blockdata_hwm * sizeof(struct blockdata), # 58| blockdata_alloced * sizeof(struct blockdata)); Error: PRINTF_ARGS (CWE-686): [#def17] dnsmasq-2.86test7/src/blockdata.c:57: invalid_type: Argument "blockdata_hwm * 48UL" to format specifier "%u" was expected to have type "unsigned int" but has type "unsigned long". # 55| my_syslog(LOG_INFO, _("pool memory in use %u, max %u, allocated %u"), # 56| blockdata_count * sizeof(struct blockdata), # 57|-> blockdata_hwm * sizeof(struct blockdata), # 58| blockdata_alloced * sizeof(struct blockdata)); # 59| } Error: PRINTF_ARGS (CWE-686): [#def18] dnsmasq-2.86test7/src/blockdata.c:58: invalid_type: Argument "blockdata_alloced * 48UL" to format specifier "%u" was expected to have type "unsigned int" but has type "unsigned long". # 56| blockdata_count * sizeof(struct blockdata), # 57| blockdata_hwm * sizeof(struct blockdata), # 58|-> blockdata_alloced * sizeof(struct blockdata)); # 59| } # 60|
* Fix few coverity warnings in lease-toolsPetr Menšík2021-09-112-14/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: UNINIT (CWE-457): [#def2] dnsmasq-2.86test7/contrib/lease-tools/dhcp_release.c:265: var_decl: Declaring variable "ifr" without initializer. dnsmasq-2.86test7/contrib/lease-tools/dhcp_release.c:285: uninit_use_in_call: Using uninitialized value "ifr". Field "ifr.ifr_ifru" is uninitialized when calling "setsockopt". # 283| strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name)-1); # 284| ifr.ifr_name[sizeof(ifr.ifr_name)-1] = '\0'; # 285|-> if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1) # 286| { # 287| perror("cannot setup interface"); Error: CHECKED_RETURN (CWE-252): [#def3] dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:346: check_return: Calling "inet_pton" without checking return value (as is done elsewhere 61 out of 72 times). dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:188: example_assign: Example 1: Assigning: "s" = return value from "inet_pton(10, ip, &result.ip)". dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:189: example_checked: Example 1 (cont.): "s" has its value checked in "s <= 0". dnsmasq-2.86test7/src/cache.c:1108: example_checked: Example 2: "inet_pton(10, token, &addr)" has its value checked in "inet_pton(10, token, &addr) > 0". dnsmasq-2.86test7/src/dbus.c:525: example_checked: Example 3: "inet_pton(2, ipaddr, &addr.addr4)" has its value checked in "inet_pton(2, ipaddr, &addr.addr4)". dnsmasq-2.86test7/src/domain.c:138: example_checked: Example 4: "inet_pton(prot, tail, addr)" has its value checked in "inet_pton(prot, tail, addr)". dnsmasq-2.86test7/src/lease.c:81: example_checked: Example 5: "inet_pton(10, dnsmasq_daemon->namebuff, &addr.addr6)" has its value checked in "inet_pton(10, dnsmasq_daemon->namebuff, &addr.addr6)". # 344| client_addr.sin6_flowinfo = 0; # 345| client_addr.sin6_scope_id =0; # 346|-> inet_pton(AF_INET6, "::", &client_addr.sin6_addr); # 347| bind(sock, (struct sockaddr*)&client_addr, sizeof(struct sockaddr_in6)); # 348| inet_pton(AF_INET6, DHCP6_MULTICAST_ADDRESS, &server_addr.sin6_addr); Error: CHECKED_RETURN (CWE-252): [#def4] dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:347: check_return: Calling "bind(sock, (struct sockaddr *)&client_addr, 28U)" without checking return value. This library function may fail and return an error code. # 345| client_addr.sin6_scope_id =0; # 346| inet_pton(AF_INET6, "::", &client_addr.sin6_addr); # 347|-> bind(sock, (struct sockaddr*)&client_addr, sizeof(struct sockaddr_in6)); # 348| inet_pton(AF_INET6, DHCP6_MULTICAST_ADDRESS, &server_addr.sin6_addr); # 349| server_addr.sin6_port = htons(DHCP6_SERVER_PORT); Error: CHECKED_RETURN (CWE-252): [#def5] dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:348: check_return: Calling "inet_pton" without checking return value (as is done elsewhere 61 out of 72 times). dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:188: example_assign: Example 1: Assigning: "s" = return value from "inet_pton(10, ip, &result.ip)". dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:189: example_checked: Example 1 (cont.): "s" has its value checked in "s <= 0". dnsmasq-2.86test7/src/cache.c:1108: example_checked: Example 2: "inet_pton(10, token, &addr)" has its value checked in "inet_pton(10, token, &addr) > 0". dnsmasq-2.86test7/src/dbus.c:525: example_checked: Example 3: "inet_pton(2, ipaddr, &addr.addr4)" has its value checked in "inet_pton(2, ipaddr, &addr.addr4)". dnsmasq-2.86test7/src/domain.c:138: example_checked: Example 4: "inet_pton(prot, tail, addr)" has its value checked in "inet_pton(prot, tail, addr)". dnsmasq-2.86test7/src/lease.c:81: example_checked: Example 5: "inet_pton(10, dnsmasq_daemon->namebuff, &addr.addr6)" has its value checked in "inet_pton(10, dnsmasq_daemon->namebuff, &addr.addr6)". # 346| inet_pton(AF_INET6, "::", &client_addr.sin6_addr); # 347| bind(sock, (struct sockaddr*)&client_addr, sizeof(struct sockaddr_in6)); # 348|-> inet_pton(AF_INET6, DHCP6_MULTICAST_ADDRESS, &server_addr.sin6_addr); # 349| server_addr.sin6_port = htons(DHCP6_SERVER_PORT); # 350| int16_t recv_size = 0; Error: NEGATIVE_RETURNS (CWE-394): [#def6] dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:360: var_tested_neg: Variable "recv_size" tests negative. dnsmasq-2.86test7/contrib/lease-tools/dhcp_release6.c:373: negative_returns: "recv_size" is passed to a parameter that cannot be negative. # 371| } # 372| # 373|-> int16_t result = parse_packet(response, recv_size); # 374| if (result == NOT_REPLY_CODE) # 375| {
* Fix bunch of warnings in auth.cPetr Menšík2021-09-111-8/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Error: CLANG_WARNING: [#def7] dnsmasq-2.86test7/src/auth.c:420:5: warning[deadcode.DeadStores]: Value stored to 'found' is never read # 418| if (!found && is_name_synthetic(flag, name, &addr) ) # 419| { # 420|-> found = 1; # 421| nxdomain = 0; # 422| Error: CLANG_WARNING: [#def8] dnsmasq-2.86test7/src/auth.c:436:8: warning[deadcode.DeadStores]: Value stored to 'found' is never read # 434| { # 435| auth = soa = 1; /* inhibits auth section */ # 436|-> found = 1; # 437| log_query(F_RRNAME | F_AUTH, zone->domain, NULL, "<SOA>"); # 438| } Error: CLANG_WARNING: [#def9] dnsmasq-2.86test7/src/auth.c:472:8: warning[deadcode.DeadStores]: Value stored to 'found' is never read # 470| ns = 1; /* ensure we include NS records! */ # 471| axfr = 1; # 472|-> found = 1; # 473| axfroffset = nameoffset; # 474| log_query(F_RRNAME | F_AUTH, zone->domain, NULL, "<AXFR>"); Error: CLANG_WARNING: [#def10] dnsmasq-2.86test7/src/auth.c:480:8: warning[deadcode.DeadStores]: Value stored to 'found' is never read # 478| auth = 1; # 479| ns = 1; /* inhibits auth section */ # 480|-> found = 1; # 481| log_query(F_RRNAME | F_AUTH, zone->domain, NULL, "<NS>"); # 482| } Error: CLANG_WARNING: [#def11] dnsmasq-2.86test7/src/auth.c:501:4: warning[deadcode.DeadStores]: Value stored to 'found' is never read # 499| log_query(crecp->flags, name, &crecp->addr, record_source(crecp->uid)); # 500| *cut = 0; /* remove domain part */ # 501|-> found = 1; # 502| if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, # 503| daemon->auth_ttl, NULL, qtype, C_IN, Error: CLANG_WARNING: [#def12] dnsmasq-2.86test7/src/auth.c:522:8: warning[deadcode.DeadStores]: Value stored to 'found' is never read # 520| { # 521| log_query(crecp->flags, name, &crecp->addr, record_source(crecp->uid)); # 522|-> found = 1; # 523| if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, # 524| daemon->auth_ttl, NULL, qtype, C_IN, Error: CLANG_WARNING: [#def13] dnsmasq-2.86test7/src/auth.c:617:8: warning[deadcode.DeadStores]: Value stored to 'p' is never read # 615| p += sprintf(p, "%u.", a & 0xff); # 616| a = a >> 8; # 617|-> p += sprintf(p, "%u.in-addr.arpa", a & 0xff); # 618| # 619| } Error: CPPCHECK_WARNING (CWE-758): [#def14] dnsmasq-2.86test7/src/auth.c:627: warning[objectIndex]: The address of local variable 'addr6' might be accessed at non-zero index. # 625| for (i = subnet->prefixlen-1; i >= 0; i -= 4) # 626| { # 627|-> int dig = ((unsigned char *)&subnet->addr.addr6)[i>>3]; # 628| p += sprintf(p, "%.1x.", (i>>2) & 1 ? dig & 15 : dig >> 4); # 629| } Error: CLANG_WARNING: [#def15] dnsmasq-2.86test7/src/auth.c:630:8: warning[deadcode.DeadStores]: Value stored to 'p' is never read # 628| p += sprintf(p, "%.1x.", (i>>2) & 1 ? dig & 15 : dig >> 4); # 629| } # 630|-> p += sprintf(p, "ip6.arpa"); # 631| # 632| }