X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-common%2Fstrlst.c;h=01118703448dc80f873abd9ab356a644899d9054;hb=0da62a499e177d194cb8622e3cd1dd9d6bc170e8;hp=a7df6c97a8545998d4868b16ae098e56afc5968c;hpb=9b68da84a46cfb4989bee3499278ada856d96758;p=catta diff --git a/avahi-common/strlst.c b/avahi-common/strlst.c index a7df6c9..0111870 100644 --- a/avahi-common/strlst.c +++ b/avahi-common/strlst.c @@ -68,29 +68,45 @@ AvahiStringList *avahi_string_list_add(AvahiStringList *l, const char *text) { return avahi_string_list_add_arbitrary(l, (const uint8_t*) text, strlen(text)); } -AvahiStringList *avahi_string_list_parse(const void* data, size_t size) { - AvahiStringList *r = NULL; +int avahi_string_list_parse(const void* data, size_t size, AvahiStringList **ret) { const uint8_t *c; + AvahiStringList *r; assert(data); + assert(ret); + + r = NULL; c = data; - for (;;) { + while (size > 0) { size_t k; - if (size < 1) - break; - k = *(c++); + size--; - if (k > 0) /* Ignore empty strings */ - r = avahi_string_list_add_arbitrary(r, c, k); - c += k; + if (k > size) + goto fail; /* Overflow */ + + if (k > 0) { /* Ignore empty strings */ + AvahiStringList *n; - size -= 1 + k; + if (!(n = avahi_string_list_add_arbitrary(r, c, k))) + goto fail; /* OOM */ + + r = n; + } + + c += k; + size -= k; } - return r; + *ret = r; + + return 0; + +fail: + avahi_string_list_free(*ret); + return -1; } void avahi_string_list_free(AvahiStringList *l) { @@ -283,7 +299,10 @@ AvahiStringList *avahi_string_list_copy(const AvahiStringList *l) { AvahiStringList *r = NULL; for (; l; l = l->next) - r = avahi_string_list_add_arbitrary(r, l->text, l->size); + if (!(r = avahi_string_list_add_arbitrary(r, l->text, l->size))) { + avahi_string_list_free(r); + return NULL; + } return avahi_string_list_reverse(r); } @@ -477,10 +496,13 @@ uint32_t avahi_string_list_get_service_cookie(AvahiStringList *l) { return AVAHI_SERVICE_COOKIE_INVALID; ret = (uint32_t) strtoll(value, &end, 0); - avahi_free(value); - if (*value && end && *end != 0) + if (*value && end && *end != 0) { + avahi_free(value); return AVAHI_SERVICE_COOKIE_INVALID; + } + avahi_free(value); + return ret; }