summaryrefslogtreecommitdiffstats
path: root/avahi-common/strlst.c
diff options
context:
space:
mode:
Diffstat (limited to 'avahi-common/strlst.c')
-rw-r--r--avahi-common/strlst.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/avahi-common/strlst.c b/avahi-common/strlst.c
index 04941b4..4b96112 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) {