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