mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
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 <berrange@redhat.com>
This commit is contained in:
parent
c4f9edf1a1
commit
7e6aabc61f
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user