From: Daniel P. Berrange Date: Wed, 3 Apr 2013 13:33:56 +0000 (+0100) Subject: Copy struct inotify_event entries to avoid alignment problems X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7e6aabc61f02f78fd8b229914744c127b83dec76;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git Copy struct inotify_event entries to avoid alignment problems 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 --- diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 6cff6fddb..4fc2315cb 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);