mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-03-13 12:58:20 +03:00
resolve: fix NULL deref on strv comparison
A strv might be NULL if it is empty. The txt.strings comparison doesn't take that into account. Introduce strv_equal() to provide a proper helper for this and fix resolve to use it. Thanks to Stanisław Pitucha <viraptor@gmail.com> for reporting this!
This commit is contained in:
parent
342f3005f5
commit
0f84a72e3c
@ -370,14 +370,8 @@ int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecor
|
||||
strcaseeq(a->hinfo.os, b->hinfo.os);
|
||||
|
||||
case DNS_TYPE_SPF: /* exactly the same as TXT */
|
||||
case DNS_TYPE_TXT: {
|
||||
int i;
|
||||
|
||||
for (i = 0; a->txt.strings[i] || b->txt.strings[i]; i++)
|
||||
if (!streq_ptr(a->txt.strings[i], b->txt.strings[i]))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
case DNS_TYPE_TXT:
|
||||
return strv_equal(a->txt.strings, b->txt.strings);
|
||||
|
||||
case DNS_TYPE_A:
|
||||
return memcmp(&a->a.in_addr, &b->a.in_addr, sizeof(struct in_addr)) == 0;
|
||||
|
@ -587,6 +587,17 @@ char **strv_sort(char **l) {
|
||||
return l;
|
||||
}
|
||||
|
||||
bool strv_equal(char **a, char **b) {
|
||||
if (!a || !b)
|
||||
return a == b;
|
||||
|
||||
for ( ; *a || *b; ++a, ++b)
|
||||
if (!streq_ptr(*a, *b))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void strv_print(char **l) {
|
||||
char **s;
|
||||
|
||||
|
@ -49,6 +49,8 @@ int strv_consume_prepend(char ***l, char *value);
|
||||
char **strv_remove(char **l, const char *s);
|
||||
char **strv_uniq(char **l);
|
||||
|
||||
bool strv_equal(char **a, char **b);
|
||||
|
||||
#define strv_contains(l, s) (!!strv_find((l), (s)))
|
||||
|
||||
char **strv_new(const char *x, ...) _sentinel_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user