X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-common%2Fstrlst.c;h=01118703448dc80f873abd9ab356a644899d9054;hb=0da62a499e177d194cb8622e3cd1dd9d6bc170e8;hp=04941b4e9d116fe2d88afcfeb0047c8530cbe433;hpb=02e302dc116e359471aee1d9fb4f99fc0d442f24;p=catta diff --git a/avahi-common/strlst.c b/avahi-common/strlst.c index 04941b4..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; + + if (!(n = avahi_string_list_add_arbitrary(r, c, k))) + goto fail; /* OOM */ - size -= 1 + k; + 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); }