On Fri, Feb 13, 2009 at 11:54:11AM +0000, Mark McLoughlin wrote: > libvirt_proxy.c: In function 'proxyReadClientSocket': > libvirt_proxy.c:659: error: dereferencing pointer 'req' does break strict-aliasing rules > libvirt_proxy.c:657: error: dereferencing pointer 'req' does break strict-aliasing rules [snip] > libvirt_proxy.c:405: error: dereferencing pointer 'req' does break strict-aliasing rules > libvirt_proxy.c:355: note: initialized from here > cc1: error: dereferencing pointer 'req' does break strict-aliasing rules > libvirt_proxy.c:355: note: initialized from here > > Signed-off-by: Mark McLoughlin <markmc@xxxxxxxxxx> > --- > proxy/libvirt_proxy.c | 47 +++++++++++++++++++++++++---------------------- > 1 files changed, 25 insertions(+), 22 deletions(-) > > diff --git a/proxy/libvirt_proxy.c b/proxy/libvirt_proxy.c > index 863dc32..9e2efbf 100644 > --- a/proxy/libvirt_proxy.c > +++ b/proxy/libvirt_proxy.c > @@ -351,8 +351,11 @@ proxyWriteClientSocket(int nr, virProxyPacketPtr req) { > static int > proxyReadClientSocket(int nr) { > virDomainDefPtr def; > - virProxyFullPacket request; > - virProxyPacketPtr req = (virProxyPacketPtr) &request; > + union { > + virProxyFullPacket full_request; > + virProxyPacket request; > + } r; > + virProxyPacketPtr req = &r.request; Minor indentation bug there in the union. > int ret; > char *xml, *ostype; > > @@ -398,7 +401,7 @@ retry: > */ > if (req->len > ret) { > int total, extra; > - char *base = (char *) &request; > + char *base = (char *) &r; > > total = ret; > while (total < req->len) { > @@ -444,8 +447,8 @@ retry2: > > if (req->len != sizeof(virProxyPacket)) > goto comm_error; > - maxids = sizeof(request.extra.arg) / sizeof(int); > - ret = xenHypervisorListDomains(conn, &request.extra.arg[0], > + maxids = sizeof(r.full_request.extra.arg) / sizeof(int); > + ret = xenHypervisorListDomains(conn, &r.full_request.extra.arg[0], > maxids); > if (ret < 0) { > req->len = sizeof(virProxyPacket); > @@ -469,9 +472,9 @@ retry2: > case VIR_PROXY_DOMAIN_INFO: > if (req->len != sizeof(virProxyPacket)) > goto comm_error; > - memset(&request.extra.dinfo, 0, sizeof(virDomainInfo)); > + memset(&r.full_request.extra.dinfo, 0, sizeof(virDomainInfo)); > ret = xenHypervisorGetDomInfo(conn, req->data.arg, > - &request.extra.dinfo); > + &r.full_request.extra.dinfo); > if (ret < 0) { > req->data.arg = -1; > } else { > @@ -495,8 +498,8 @@ retry2: > name[1000] = 0; > } > req->len += VIR_UUID_BUFLEN + len + 1; > - memcpy(&request.extra.str[0], uuid, VIR_UUID_BUFLEN); > - strcpy(&request.extra.str[VIR_UUID_BUFLEN], name); > + memcpy(&r.full_request.extra.str[0], uuid, VIR_UUID_BUFLEN); > + strcpy(&r.full_request.extra.str[VIR_UUID_BUFLEN], name); > } > free(name); > break; > @@ -521,7 +524,7 @@ retry2: > if (names != NULL) { > while (*tmp != NULL) { > ident = xenDaemonDomainLookupByName_ids(conn, *tmp, &uuid[0]); > - if (!memcmp(uuid, &request.extra.str[0], VIR_UUID_BUFLEN)) { > + if (!memcmp(uuid, &r.full_request.extra.str[0], VIR_UUID_BUFLEN)) { > name = *tmp; > break; > } > @@ -539,7 +542,7 @@ retry2: > name[1000] = 0; > } > req->len = sizeof(virProxyPacket) + len + 1; > - strcpy(&request.extra.str[0], name); > + strcpy(&r.full_request.extra.str[0], name); > req->data.arg = ident; > } > free(names); > @@ -553,14 +556,14 @@ retry2: > goto comm_error; > > ident = xenDaemonDomainLookupByName_ids(conn, > - &request.extra.str[0], &uuid[0]); > + &r.full_request.extra.str[0], &uuid[0]); > if (ident < 0) { > /* not found */ > req->data.arg = -1; > req->len = sizeof(virProxyPacket); > } else { > req->len = sizeof(virProxyPacket) + VIR_UUID_BUFLEN; > - memcpy(&request.extra.str[0], uuid, VIR_UUID_BUFLEN); > + memcpy(&r.full_request.extra.str[0], uuid, VIR_UUID_BUFLEN); > req->data.arg = ident; > } > break; > @@ -574,7 +577,7 @@ retry2: > * cache them ? Since it's probably an unfrequent call better > * not make assumption and do the xend RPC each call. > */ > - ret = xenDaemonNodeGetInfo(conn, &request.extra.ninfo); > + ret = xenDaemonNodeGetInfo(conn, &r.full_request.extra.ninfo); > if (ret < 0) { > req->data.arg = -1; > req->len = sizeof(virProxyPacket); > @@ -594,12 +597,12 @@ retry2: > req->len = sizeof (virProxyPacket); > } else { > int xmllen = strlen (xml); > - if (xmllen > (int) sizeof (request.extra.str)) { > + if (xmllen > (int) sizeof (r.full_request.extra.str)) { > req->data.arg = -2; > req->len = sizeof (virProxyPacket); > } else { > req->data.arg = 0; > - memmove (request.extra.str, xml, xmllen); > + memmove (r.full_request.extra.str, xml, xmllen); > req->len = sizeof (virProxyPacket) + xmllen; > } > free (xml); > @@ -616,7 +619,7 @@ retry2: > * rather hard to get from that code path. So proxy > * users won't see CPU pinning (last NULL arg) > */ > - def = xenDaemonDomainFetch(conn, request.data.arg, NULL, NULL); > + def = xenDaemonDomainFetch(conn, r.full_request.data.arg, NULL, NULL); > if (!def) { > req->data.arg = -1; > req->len = sizeof(virProxyPacket); > @@ -627,12 +630,12 @@ retry2: > req->len = sizeof(virProxyPacket); > } else { > int xmllen = strlen(xml); > - if (xmllen > (int) sizeof(request.extra.str)) { > + if (xmllen > (int) sizeof(r.full_request.extra.str)) { > req->data.arg = -2; > req->len = sizeof(virProxyPacket); > } else { > req->data.arg = 0; > - memmove(&request.extra.str[0], xml, xmllen); > + memmove(&r.full_request.extra.str[0], xml, xmllen); > req->len = sizeof(virProxyPacket) + xmllen; > } > free(xml); > @@ -644,18 +647,18 @@ retry2: > if (req->len != sizeof(virProxyPacket)) > goto comm_error; > > - ostype = xenStoreDomainGetOSTypeID(conn, request.data.arg); > + ostype = xenStoreDomainGetOSTypeID(conn, r.full_request.data.arg); > if (!ostype) { > req->data.arg = -1; > req->len = sizeof(virProxyPacket); > } else { > int ostypelen = strlen(ostype); > - if (ostypelen > (int) sizeof(request.extra.str)) { > + if (ostypelen > (int) sizeof(r.full_request.extra.str)) { > req->data.arg = -2; > req->len = sizeof(virProxyPacket); > } else { > req->data.arg = 0; > - memmove(&request.extra.str[0], ostype, ostypelen); > + memmove(&r.full_request.extra.str[0], ostype, ostypelen); > req->len = sizeof(virProxyPacket) + ostypelen; > } > free(ostype); > -- ACK, modulo the whitespace bug noted above Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list