summaryrefslogtreecommitdiffstats
path: root/avahi-common/strlst.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-10-27 14:30:46 +0000
committerLennart Poettering <lennart@poettering.net>2005-10-27 14:30:46 +0000
commit20011324500a728851e4888c890a756ecf71394b (patch)
tree9dc37356855fa1b1c009aa978158fac9c85f2d16 /avahi-common/strlst.c
parentcf5ee4f9a5c3625a3d13b92603d1035f976228b0 (diff)
Add validity checking to TXT data parsing, this fixes a remotely exploitable vulnerability.
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@888 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
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) {