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:
David Herrmann 2014-11-27 16:08:46 +01:00
parent 342f3005f5
commit 0f84a72e3c
3 changed files with 15 additions and 8 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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_;