From: "Daniel P. Berrange" <berrange(a)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(a)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