[libvirt] [PATCH 4/7] Copy struct inotify_event entries to avoid alignment problems

Daniel P. Berrange berrange at redhat.com
Wed Apr 3 15:06:38 UTC 2013


From: "Daniel P. Berrange" <berrange at redhat.com>

When reading the inotify FD, we get back a sequence of
struct inotify_event, each with variable length data following.
It is not safe to simply cast from the char *buf to the
struct inotify_event struct since this may violate data
alignment rules. Thus we must copy from the char *buf
into the struct inotify_event instance before accessing
the data.

uml/uml_driver.c: In function 'umlInotifyEvent':
uml/uml_driver.c:327:13: warning: cast increases required alignment of target type [-Wcast-align]
         e = (struct inotify_event *)tmp;

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/uml/uml_driver.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 09a777c..4d81a13 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -300,7 +300,7 @@ umlInotifyEvent(int watch,
                 void *data)
 {
     char buf[1024];
-    struct inotify_event *e;
+    struct inotify_event e;
     int got;
     char *tmp, *name;
     struct uml_driver *driver = data;
@@ -321,20 +321,20 @@ reread:
 
     tmp = buf;
     while (got) {
-        if (got < sizeof(struct inotify_event))
+        if (got < sizeof(e))
             goto cleanup; /* bad */
 
-        e = (struct inotify_event *)tmp;
-        tmp += sizeof(struct inotify_event);
-        got -= sizeof(struct inotify_event);
+        memcpy(&e, tmp, sizeof(e));
+        tmp += sizeof(e);
+        got -= sizeof(e);
 
-        if (got < e->len)
+        if (got < e.len)
             goto cleanup;
 
-        tmp += e->len;
-        got -= e->len;
+        tmp += e.len;
+        got -= e.len;
 
-        name = (char *)&(e->name);
+        name = (char *)&(e.name);
 
         dom = virDomainObjListFindByName(driver->domains, name);
 
@@ -342,7 +342,7 @@ reread:
             continue;
         }
 
-        if (e->mask & IN_DELETE) {
+        if (e.mask & IN_DELETE) {
             VIR_DEBUG("Got inotify domain shutdown '%s'", name);
             if (!virDomainObjIsActive(dom)) {
                 virObjectUnlock(dom);
@@ -359,7 +359,7 @@ reread:
                                        dom);
                 dom = NULL;
             }
-        } else if (e->mask & (IN_CREATE | IN_MODIFY)) {
+        } else if (e.mask & (IN_CREATE | IN_MODIFY)) {
             VIR_DEBUG("Got inotify domain startup '%s'", name);
             if (virDomainObjIsActive(dom)) {
                 virObjectUnlock(dom);
-- 
1.8.1.4




More information about the libvir-list mailing list