OSDN Git Service

Move local union such that it doesn't escape (and get optimized out).
authorStephen Hines <srhines@google.com>
Tue, 18 Aug 2015 00:16:59 +0000 (17:16 -0700)
committerStephen Hines <srhines@google.com>
Tue, 18 Aug 2015 00:39:35 +0000 (00:39 +0000)
Bug: 23239997

The Clang update exposed a latent bug in the code here, where a pointer
to a local variable escaped the encapsulating block. Clang noticed the
end of this object's lifetime, and removed assignments to its original
storage (because they are now dead assignments). By moving the union out
of the block, it will survive until the sendmsg() call, and the expected
writes will be restored.

Change-Id: If2106d2f53d761ddca6dd26ab2648244d737dcd9

client/FwmarkClient.cpp

index 5074a78..a82f4c2 100644 (file)
@@ -66,12 +66,12 @@ int FwmarkClient::send(FwmarkCommand* data, int fd) {
     message.msg_iov = &iov;
     message.msg_iovlen = 1;
 
-    if (data->cmdId != FwmarkCommand::QUERY_USER_ACCESS) {
-        union {
-            cmsghdr cmh;
-            char cmsg[CMSG_SPACE(sizeof(fd))];
-        } cmsgu;
+    union {
+        cmsghdr cmh;
+        char cmsg[CMSG_SPACE(sizeof(fd))];
+    } cmsgu;
 
+    if (data->cmdId != FwmarkCommand::QUERY_USER_ACCESS) {
         memset(cmsgu.cmsg, 0, sizeof(cmsgu.cmsg));
         message.msg_control = cmsgu.cmsg;
         message.msg_controllen = sizeof(cmsgu.cmsg);