From aeb1b0cdeed88ae4effe51823164313cdacb64d7 Mon Sep 17 00:00:00 2001 From: Arne Goedeke <el@laramies.com> Date: Tue, 11 Mar 2014 11:49:38 +0100 Subject: [PATCH] Inotify: do not assume that strings are aligned --- src/modules/Inotify/inotify.cmod | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/modules/Inotify/inotify.cmod b/src/modules/Inotify/inotify.cmod index d6d41aa8b1..6b5f279693 100644 --- a/src/modules/Inotify/inotify.cmod +++ b/src/modules/Inotify/inotify.cmod @@ -111,8 +111,9 @@ DECLARATIONS *! @endarray */ PIKEFUN array(string|int) parse_event(string data) { - struct inotify_event * event; + struct inotify_event event; size_t len; + const char * d; if (data->size_shift) Pike_error("Inotify events should not be wide.\n"); @@ -120,21 +121,24 @@ PIKEFUN array(string|int) parse_event(string data) { if ((size_t)data->len < sizeof(struct inotify_event)) Pike_error("Malformed data.\n"); - event = (struct inotify_event *)data->str; + d = data->str; - if (event->len > data->len - sizeof(struct inotify_event)) - Pike_error("Data missing.\n"); + memcpy(&event, d, sizeof(struct inotify_event)); - push_int((int)event->wd); - push_int((int)event->mask); - push_int((int)event->cookie); + push_int(event.wd); + push_int((int)event.mask); + push_int((int)event.cookie); - if (event->len && (len = strlen(event->name))) - push_string(make_shared_binary_string(event->name, len)); - else - push_int(0); + if (event.len) { + if (event.len > data->len - sizeof(struct inotify_event)) + Pike_error("Data missing. Got %u expected %u bytes.\n", (unsigned)(data->len - sizeof(struct inotify_event)), event.len); + d += sizeof(struct inotify_event); + push_string(make_shared_binary_string(d, strnlen(d, event.len))); + } else { + push_int(0); + } - push_int((int)(event->len + sizeof(struct inotify_event))); + push_int((int)(event.len + sizeof(struct inotify_event))); f_aggregate(5); stack_swap(); -- GitLab