Bug Summary

File:build-scan/../src/resolve/resolved-conf.c
Warning:line 315, column 32
Potential leak of memory pointed to by 'txt_data'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name resolved-conf.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model static -mframe-pointer=all -relaxed-aliasing -menable-no-infs -menable-no-nans -menable-unsafe-fp-math -fno-signed-zeros -mreassociate -freciprocal-math -fdenormal-fp-math=preserve-sign,preserve-sign -ffp-contract=fast -fno-rounding-math -ffast-math -ffinite-math-only -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib64/clang/12.0.0 -include config.h -I systemd-resolved.p -I . -I .. -I src/basic -I ../src/basic -I src/shared -I ../src/shared -I src/systemd -I ../src/systemd -I src/journal -I ../src/journal -I src/journal-remote -I ../src/journal-remote -I src/nspawn -I ../src/nspawn -I src/resolve -I ../src/resolve -I src/timesync -I ../src/timesync -I ../src/time-wait-sync -I src/login -I ../src/login -I src/udev -I ../src/udev -I src/libudev -I ../src/libudev -I src/core -I ../src/core -I ../src/libsystemd/sd-bus -I ../src/libsystemd/sd-device -I ../src/libsystemd/sd-hwdb -I ../src/libsystemd/sd-id128 -I ../src/libsystemd/sd-netlink -I ../src/libsystemd/sd-network -I src/libsystemd-network -I ../src/libsystemd-network -I /usr/include/p11-kit-1 -D _FILE_OFFSET_BITS=64 -internal-isystem /usr/local/include -internal-isystem /usr/lib64/clang/12.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wwrite-strings -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-result -Wno-format-signedness -Wno-error=nonnull -std=gnu99 -fconst-strings -fdebug-compilation-dir /home/mrc0mmand/repos/@redhat-plumbers/systemd-rhel8/build-scan -ferror-limit 19 -fvisibility hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -analyzer-output=html -faddrsig -o /tmp/scan-build-2021-07-16-221226-1465241-1 -x c ../src/resolve/resolved-conf.c
1/* SPDX-License-Identifier: LGPL-2.1+ */
2
3#include "alloc-util.h"
4#include "conf-parser.h"
5#include "def.h"
6#include "extract-word.h"
7#include "hexdecoct.h"
8#include "parse-util.h"
9#include "resolved-conf.h"
10#include "resolved-dnssd.h"
11#include "specifier.h"
12#include "string-table.h"
13#include "string-util.h"
14#include "utf8.h"
15
16DEFINE_CONFIG_PARSE_ENUM(config_parse_dns_stub_listener_mode, dns_stub_listener_mode, DnsStubListenerMode, "Failed to parse DNS stub listener mode setting")int config_parse_dns_stub_listener_mode(const char *unit, const
char *filename, unsigned line, const char *section, unsigned
section_line, const char *lvalue, int ltype, const char *rvalue
, void *data, void *userdata) { DnsStubListenerMode *i = data
, x; do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/resolve/resolved-conf.c"
, 16, __PRETTY_FUNCTION__); } while (0); do { if ((__builtin_expect
(!!(!(lvalue)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD
, ("lvalue"), "../src/resolve/resolved-conf.c", 16, __PRETTY_FUNCTION__
); } while (0); do { if ((__builtin_expect(!!(!(rvalue)),0)))
log_assert_failed_realm(LOG_REALM_SYSTEMD, ("rvalue"), "../src/resolve/resolved-conf.c"
, 16, __PRETTY_FUNCTION__); } while (0); do { if ((__builtin_expect
(!!(!(data)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, (
"data"), "../src/resolve/resolved-conf.c", 16, __PRETTY_FUNCTION__
); } while (0); x = dns_stub_listener_mode_from_string(rvalue
); if (x < 0) { ({ int _level = (3), _e = (0); (log_get_max_level_realm
(LOG_REALM_SYSTEMD) >= ((_level) & 0x07)) ? log_syntax_internal
(unit, _level, filename, line, _e, "../src/resolve/resolved-conf.c"
, 16, __func__, "Failed to parse DNS stub listener mode setting"
", ignoring: %s", rvalue) : -abs(_e); }); return 0; } *i = x
; return 0; }
;
17
18static const char* const dns_stub_listener_mode_table[_DNS_STUB_LISTENER_MODE_MAX] = {
19 [DNS_STUB_LISTENER_NO] = "no",
20 [DNS_STUB_LISTENER_UDP] = "udp",
21 [DNS_STUB_LISTENER_TCP] = "tcp",
22 [DNS_STUB_LISTENER_YES] = "yes",
23};
24DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dns_stub_listener_mode, DnsStubListenerMode, DNS_STUB_LISTENER_YES)const char *dns_stub_listener_mode_to_string(DnsStubListenerMode
i) { if (i < 0 || i >= (DnsStubListenerMode) __extension__
(__builtin_choose_expr( !__builtin_types_compatible_p(typeof
(dns_stub_listener_mode_table), typeof(&*(dns_stub_listener_mode_table
))), sizeof(dns_stub_listener_mode_table)/sizeof((dns_stub_listener_mode_table
)[0]), ((void)0)))) return ((void*)0); return dns_stub_listener_mode_table
[i]; } DnsStubListenerMode dns_stub_listener_mode_from_string
(const char *s) { int b; if (!s) return -1; b = parse_boolean
(s); if (b == 0) return (DnsStubListenerMode) 0; else if (b >
0) return DNS_STUB_LISTENER_YES; return (DnsStubListenerMode
) string_table_lookup(dns_stub_listener_mode_table, __extension__
(__builtin_choose_expr( !__builtin_types_compatible_p(typeof
(dns_stub_listener_mode_table), typeof(&*(dns_stub_listener_mode_table
))), sizeof(dns_stub_listener_mode_table)/sizeof((dns_stub_listener_mode_table
)[0]), ((void)0))), s); }
;
25
26int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word) {
27 union in_addr_union address;
28 int family, r, ifindex = 0;
29 DnsServer *s;
30
31 assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("m"), "../src/resolve/resolved-conf.c", 31
, __PRETTY_FUNCTION__); } while (0)
;
32 assert(word)do { if ((__builtin_expect(!!(!(word)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("word"), "../src/resolve/resolved-conf.c"
, 32, __PRETTY_FUNCTION__); } while (0)
;
33
34 r = in_addr_ifindex_from_string_auto(word, &family, &address, &ifindex);
35 if (r < 0)
36 return r;
37
38 /* Silently filter out 0.0.0.0 and 127.0.0.53 (our own stub DNS listener) */
39 if (!dns_server_address_valid(family, &address))
40 return 0;
41
42 /* Filter out duplicates */
43 s = dns_server_find(manager_get_first_dns_server(m, type), family, &address, ifindex);
44 if (s) {
45 /*
46 * Drop the marker. This is used to find the servers
47 * that ceased to exist, see
48 * manager_mark_dns_servers() and
49 * manager_flush_marked_dns_servers().
50 */
51 dns_server_move_back_and_unmark(s);
52 return 0;
53 }
54
55 return dns_server_new(m, NULL((void*)0), type, NULL((void*)0), family, &address, ifindex);
56}
57
58int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string) {
59 int r;
60
61 assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("m"), "../src/resolve/resolved-conf.c", 61
, __PRETTY_FUNCTION__); } while (0)
;
62 assert(string)do { if ((__builtin_expect(!!(!(string)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("string"), "../src/resolve/resolved-conf.c"
, 62, __PRETTY_FUNCTION__); } while (0)
;
63
64 for (;;) {
65 _cleanup_free___attribute__((cleanup(freep))) char *word = NULL((void*)0);
66
67 r = extract_first_word(&string, &word, NULL((void*)0), 0);
68 if (r < 0)
69 return r;
70 if (r == 0)
71 break;
72
73 r = manager_add_dns_server_by_string(m, type, word);
74 if (r < 0)
75 log_warning_errno(r, "Failed to add DNS server address '%s', ignoring: %m", word)({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/resolve/resolved-conf.c", 75, __func__, "Failed to add DNS server address '%s', ignoring: %m"
, word) : -abs(_e); })
;
76 }
77
78 return 0;
79}
80
81int manager_add_search_domain_by_string(Manager *m, const char *domain) {
82 DnsSearchDomain *d;
83 bool_Bool route_only;
84 int r;
85
86 assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("m"), "../src/resolve/resolved-conf.c", 86
, __PRETTY_FUNCTION__); } while (0)
;
87 assert(domain)do { if ((__builtin_expect(!!(!(domain)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("domain"), "../src/resolve/resolved-conf.c"
, 87, __PRETTY_FUNCTION__); } while (0)
;
88
89 route_only = *domain == '~';
90 if (route_only)
91 domain++;
92
93 if (dns_name_is_root(domain) || streq(domain, "*")(strcmp((domain),("*")) == 0)) {
94 route_only = true1;
95 domain = ".";
96 }
97
98 r = dns_search_domain_find(m->search_domains, domain, &d);
99 if (r < 0)
100 return r;
101 if (r > 0)
102 dns_search_domain_move_back_and_unmark(d);
103 else {
104 r = dns_search_domain_new(m, &d, DNS_SEARCH_DOMAIN_SYSTEM, NULL((void*)0), domain);
105 if (r < 0)
106 return r;
107 }
108
109 d->route_only = route_only;
110 return 0;
111}
112
113int manager_parse_search_domains_and_warn(Manager *m, const char *string) {
114 int r;
115
116 assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("m"), "../src/resolve/resolved-conf.c", 116
, __PRETTY_FUNCTION__); } while (0)
;
117 assert(string)do { if ((__builtin_expect(!!(!(string)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("string"), "../src/resolve/resolved-conf.c"
, 117, __PRETTY_FUNCTION__); } while (0)
;
118
119 for (;;) {
120 _cleanup_free___attribute__((cleanup(freep))) char *word = NULL((void*)0);
121
122 r = extract_first_word(&string, &word, NULL((void*)0), EXTRACT_QUOTES);
123 if (r < 0)
124 return r;
125 if (r == 0)
126 break;
127
128 r = manager_add_search_domain_by_string(m, word);
129 if (r < 0)
130 log_warning_errno(r, "Failed to add search domain '%s', ignoring: %m", word)({ int _level = ((4)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/resolve/resolved-conf.c", 130, __func__, "Failed to add search domain '%s', ignoring: %m"
, word) : -abs(_e); })
;
131 }
132
133 return 0;
134}
135
136int config_parse_dns_servers(
137 const char *unit,
138 const char *filename,
139 unsigned line,
140 const char *section,
141 unsigned section_line,
142 const char *lvalue,
143 int ltype,
144 const char *rvalue,
145 void *data,
146 void *userdata) {
147
148 Manager *m = userdata;
149 int r;
150
151 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/resolve/resolved-conf.c"
, 151, __PRETTY_FUNCTION__); } while (0)
;
152 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/resolve/resolved-conf.c"
, 152, __PRETTY_FUNCTION__); } while (0)
;
153 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/resolve/resolved-conf.c"
, 153, __PRETTY_FUNCTION__); } while (0)
;
154 assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("m"), "../src/resolve/resolved-conf.c", 154
, __PRETTY_FUNCTION__); } while (0)
;
155
156 if (isempty(rvalue))
157 /* Empty assignment means clear the list */
158 dns_server_unlink_all(manager_get_first_dns_server(m, ltype));
159 else {
160 /* Otherwise, add to the list */
161 r = manager_parse_dns_server_string_and_warn(m, ltype, rvalue);
162 if (r < 0) {
163 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse DNS server string '%s'. Ignoring.", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 163, __func__
, "Failed to parse DNS server string '%s'. Ignoring.", rvalue
) : -abs(_e); })
;
164 return 0;
165 }
166 }
167
168 /* If we have a manual setting, then we stop reading
169 * /etc/resolv.conf */
170 if (ltype == DNS_SERVER_SYSTEM)
171 m->read_resolv_conf = false0;
172 if (ltype == DNS_SERVER_FALLBACK)
173 m->need_builtin_fallbacks = false0;
174
175 return 0;
176}
177
178int config_parse_search_domains(
179 const char *unit,
180 const char *filename,
181 unsigned line,
182 const char *section,
183 unsigned section_line,
184 const char *lvalue,
185 int ltype,
186 const char *rvalue,
187 void *data,
188 void *userdata) {
189
190 Manager *m = userdata;
191 int r;
192
193 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/resolve/resolved-conf.c"
, 193, __PRETTY_FUNCTION__); } while (0)
;
194 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/resolve/resolved-conf.c"
, 194, __PRETTY_FUNCTION__); } while (0)
;
195 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/resolve/resolved-conf.c"
, 195, __PRETTY_FUNCTION__); } while (0)
;
196 assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("m"), "../src/resolve/resolved-conf.c", 196
, __PRETTY_FUNCTION__); } while (0)
;
197
198 if (isempty(rvalue))
199 /* Empty assignment means clear the list */
200 dns_search_domain_unlink_all(m->search_domains);
201 else {
202 /* Otherwise, add to the list */
203 r = manager_parse_search_domains_and_warn(m, rvalue);
204 if (r < 0) {
205 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse search domains string '%s'. Ignoring.", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 205, __func__
, "Failed to parse search domains string '%s'. Ignoring.", rvalue
) : -abs(_e); })
;
206 return 0;
207 }
208 }
209
210 /* If we have a manual setting, then we stop reading
211 * /etc/resolv.conf */
212 m->read_resolv_conf = false0;
213
214 return 0;
215}
216
217int config_parse_dnssd_service_name(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) {
218 static const Specifier specifier_table[] = {
219 { 'b', specifier_boot_id, NULL((void*)0) },
220 { 'H', specifier_host_name, NULL((void*)0) },
221 { 'm', specifier_machine_id, NULL((void*)0) },
222 { 'v', specifier_kernel_release, NULL((void*)0) },
223 {}
224 };
225 DnssdService *s = userdata;
226 _cleanup_free___attribute__((cleanup(freep))) char *name = NULL((void*)0);
227 int r;
228
229 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/resolve/resolved-conf.c"
, 229, __PRETTY_FUNCTION__); } while (0)
;
230 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/resolve/resolved-conf.c"
, 230, __PRETTY_FUNCTION__); } while (0)
;
231 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/resolve/resolved-conf.c"
, 231, __PRETTY_FUNCTION__); } while (0)
;
232 assert(s)do { if ((__builtin_expect(!!(!(s)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("s"), "../src/resolve/resolved-conf.c", 232
, __PRETTY_FUNCTION__); } while (0)
;
233
234 if (isempty(rvalue)) {
235 log_syntax(unit, LOG_ERR, filename, line, 0, "Service instance name can't be empty. Ignoring.")({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 235, __func__
, "Service instance name can't be empty. Ignoring.") : -abs(_e
); })
;
236 return -EINVAL22;
237 }
238
239 r = free_and_strdup(&s->name_template, rvalue);
240 if (r < 0)
241 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 241, __func__)
;
242
243 r = specifier_printf(s->name_template, specifier_table, NULL((void*)0), &name);
244 if (r < 0)
245 return log_debug_errno(r, "Failed to replace specifiers: %m")({ int _level = ((7)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/resolve/resolved-conf.c", 245, __func__, "Failed to replace specifiers: %m"
) : -abs(_e); })
;
246
247 if (!dns_service_name_is_valid(name)) {
248 log_syntax(unit, LOG_ERR, filename, line, 0, "Service instance name template renders to invalid name '%s'. Ignoring.", name)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 248, __func__
, "Service instance name template renders to invalid name '%s'. Ignoring."
, name) : -abs(_e); })
;
249 return -EINVAL22;
250 }
251
252 return 0;
253}
254
255int config_parse_dnssd_service_type(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) {
256 DnssdService *s = userdata;
257 int r;
258
259 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/resolve/resolved-conf.c"
, 259, __PRETTY_FUNCTION__); } while (0)
;
260 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/resolve/resolved-conf.c"
, 260, __PRETTY_FUNCTION__); } while (0)
;
261 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/resolve/resolved-conf.c"
, 261, __PRETTY_FUNCTION__); } while (0)
;
262 assert(s)do { if ((__builtin_expect(!!(!(s)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("s"), "../src/resolve/resolved-conf.c", 262
, __PRETTY_FUNCTION__); } while (0)
;
263
264 if (isempty(rvalue)) {
265 log_syntax(unit, LOG_ERR, filename, line, 0, "Service type can't be empty. Ignoring.")({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 265, __func__
, "Service type can't be empty. Ignoring.") : -abs(_e); })
;
266 return -EINVAL22;
267 }
268
269 if (!dnssd_srv_type_is_valid(rvalue)) {
270 log_syntax(unit, LOG_ERR, filename, line, 0, "Service type is invalid. Ignoring.")({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 270, __func__
, "Service type is invalid. Ignoring.") : -abs(_e); })
;
271 return -EINVAL22;
272 }
273
274 r = free_and_strdup(&s->type, rvalue);
275 if (r < 0)
276 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 276, __func__)
;
277
278 return 0;
279}
280
281int config_parse_dnssd_txt(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) {
282 _cleanup_(dnssd_txtdata_freep)__attribute__((cleanup(dnssd_txtdata_freep))) DnssdTxtData *txt_data = NULL((void*)0);
283 DnssdService *s = userdata;
284 DnsTxtItem *last = NULL((void*)0);
285
286 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/resolve/resolved-conf.c"
, 286, __PRETTY_FUNCTION__); } while (0)
;
1
Assuming 'filename' is non-null
2
Taking false branch
3
Loop condition is false. Exiting loop
287 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/resolve/resolved-conf.c"
, 287, __PRETTY_FUNCTION__); } while (0)
;
4
Assuming 'lvalue' is non-null
5
Taking false branch
6
Loop condition is false. Exiting loop
288 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/resolve/resolved-conf.c"
, 288, __PRETTY_FUNCTION__); } while (0)
;
7
Assuming 'rvalue' is non-null
8
Taking false branch
9
Loop condition is false. Exiting loop
289 assert(s)do { if ((__builtin_expect(!!(!(s)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("s"), "../src/resolve/resolved-conf.c", 289
, __PRETTY_FUNCTION__); } while (0)
;
10
Assuming 's' is non-null
11
Taking false branch
12
Loop condition is false. Exiting loop
290
291 if (isempty(rvalue)) {
13
Taking false branch
292 /* Flush out collected items */
293 s->txt_data_items = dnssd_txtdata_free_all(s->txt_data_items);
294 return 0;
295 }
296
297 txt_data = new0(DnssdTxtData, 1)((DnssdTxtData*) calloc((1), sizeof(DnssdTxtData)));
14
Memory is allocated
298 if (!txt_data)
15
Assuming 'txt_data' is non-null
16
Taking false branch
299 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 299, __func__)
;
300
301 for (;;) {
17
Loop condition is true. Entering loop body
302 _cleanup_free___attribute__((cleanup(freep))) char *word = NULL((void*)0);
303 _cleanup_free___attribute__((cleanup(freep))) char *key = NULL((void*)0);
304 _cleanup_free___attribute__((cleanup(freep))) char *value = NULL((void*)0);
305 _cleanup_free___attribute__((cleanup(freep))) void *decoded = NULL((void*)0);
306 size_t length = 0;
307 DnsTxtItem *i;
308 int r;
309
310 r = extract_first_word(&rvalue, &word, NULL((void*)0),
311 EXTRACT_QUOTES|EXTRACT_CUNESCAPE|EXTRACT_CUNESCAPE_RELAX);
312 if (r == 0)
18
Assuming 'r' is not equal to 0
19
Taking false branch
313 break;
314 if (r == -ENOMEM12)
20
Assuming the condition is true
21
Taking true branch
315 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 315, __func__)
;
22
Potential leak of memory pointed to by 'txt_data'
316 if (r < 0)
317 return log_syntax(unit, LOG_ERR, filename, line, r, "Invalid syntax, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 317, __func__
, "Invalid syntax, ignoring: %s", rvalue) : -abs(_e); })
;
318
319 r = split_pair(word, "=", &key, &value);
320 if (r == -ENOMEM12)
321 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 321, __func__)
;
322 if (r == -EINVAL22)
323 key = TAKE_PTR(word)({ typeof(word) _ptr_ = (word); (word) = ((void*)0); _ptr_; }
)
;
324
325 if (!ascii_is_valid(key)) {
326 log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid syntax, ignoring: %s", key)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 326, __func__
, "Invalid syntax, ignoring: %s", key) : -abs(_e); })
;
327 return -EINVAL22;
328 }
329
330 switch (ltype) {
331
332 case DNS_TXT_ITEM_DATA:
333 if (value) {
334 r = unbase64mem(value, strlen(value), &decoded, &length);
335 if (r == -ENOMEM12)
336 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 336, __func__)
;
337 if (r < 0)
338 return log_syntax(unit, LOG_ERR, filename, line, r,({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 339, __func__
, "Invalid base64 encoding, ignoring: %s", value) : -abs(_e);
})
339 "Invalid base64 encoding, ignoring: %s", value)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/resolve/resolved-conf.c", 339, __func__
, "Invalid base64 encoding, ignoring: %s", value) : -abs(_e);
})
;
340 }
341
342 r = dnssd_txt_item_new_from_data(key, decoded, length, &i);
343 if (r < 0)
344 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 344, __func__)
;
345 break;
346
347 case DNS_TXT_ITEM_TEXT:
348 r = dnssd_txt_item_new_from_string(key, value, &i);
349 if (r < 0)
350 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/resolve/resolved-conf.c"
, 350, __func__)
;
351 break;
352
353 default:
354 assert_not_reached("Unknown type of Txt config")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, (
"Unknown type of Txt config"), "../src/resolve/resolved-conf.c"
, 354, __PRETTY_FUNCTION__); } while (0)
;
355 }
356
357 LIST_INSERT_AFTER(items, txt_data->txt, last, i)do { typeof(*(txt_data->txt)) **_head = &(txt_data->
txt), *_a = (last), *_b = (i); do { if ((__builtin_expect(!!(
!(_b)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("_b")
, "../src/resolve/resolved-conf.c", 357, __PRETTY_FUNCTION__)
; } while (0); if (!_a) { if ((_b->items_next = *_head)) _b
->items_next->items_prev = _b; _b->items_prev = ((void
*)0); *_head = _b; } else { if ((_b->items_next = _a->items_next
)) _b->items_next->items_prev = _b; _b->items_prev =
_a; _a->items_next = _b; } } while (0)
;
358 last = i;
359 }
360
361 if (!LIST_IS_EMPTY(txt_data->txt)(!(txt_data->txt))) {
362 LIST_PREPEND(items, s->txt_data_items, txt_data)do { typeof(*(s->txt_data_items)) **_head = &(s->txt_data_items
), *_item = (txt_data); do { if ((__builtin_expect(!!(!(_item
)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("_item"),
"../src/resolve/resolved-conf.c", 362, __PRETTY_FUNCTION__);
} while (0); if ((_item->items_next = *_head)) _item->
items_next->items_prev = _item; _item->items_prev = ((void
*)0); *_head = _item; } while (0)
;
363 txt_data = NULL((void*)0);
364 }
365
366 return 0;
367}
368
369int manager_parse_config_file(Manager *m) {
370 int r;
371
372 assert(m)do { if ((__builtin_expect(!!(!(m)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("m"), "../src/resolve/resolved-conf.c", 372
, __PRETTY_FUNCTION__); } while (0)
;
373
374 r = config_parse_many_nulstr(PKGSYSCONFDIR"/etc/systemd" "/resolved.conf",
375 CONF_PATHS_NULSTR("systemd/resolved.conf.d")"/etc/" "systemd/resolved.conf.d" "\0" "/run/" "systemd/resolved.conf.d"
"\0" "/usr/local/lib/" "systemd/resolved.conf.d" "\0" "/usr/lib/"
"systemd/resolved.conf.d" "\0"
,
376 "Resolve\0",
377 config_item_perf_lookup, resolved_gperf_lookup,
378 CONFIG_PARSE_WARN, m);
379 if (r < 0)
380 return r;
381
382 if (m->need_builtin_fallbacks) {
383 r = manager_parse_dns_server_string_and_warn(m, DNS_SERVER_FALLBACK, DNS_SERVERS"8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844");
384 if (r < 0)
385 return r;
386 }
387
388#if ! HAVE_GCRYPT1
389 if (m->dnssec_mode != DNSSEC_NO) {
390 log_warning("DNSSEC option cannot be enabled or set to allow-downgrade when systemd-resolved is built without gcrypt support. Turning off DNSSEC support.")({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/resolve/resolved-conf.c", 390, __func__, "DNSSEC option cannot be enabled or set to allow-downgrade when systemd-resolved is built without gcrypt support. Turning off DNSSEC support."
) : -abs(_e); })
;
391 m->dnssec_mode = DNSSEC_NO;
392 }
393#endif
394
395#if ! ENABLE_DNS_OVER_TLS1
396 if (m->dns_over_tls_mode != DNS_OVER_TLS_NO) {
397 log_warning("DNS-over-TLS option cannot be set to opportunistic when systemd-resolved is built without DNS-over-TLS support. Turning off DNS-over-TLS support.")({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/resolve/resolved-conf.c", 397, __func__, "DNS-over-TLS option cannot be set to opportunistic when systemd-resolved is built without DNS-over-TLS support. Turning off DNS-over-TLS support."
) : -abs(_e); })
;
398 m->dns_over_tls_mode = DNS_OVER_TLS_NO;
399 }
400#endif
401 return 0;
402
403}