Fixed the type-punned pointer and strict aliasing issue. Dereferencing a pointer cast from a different type of pointer violates the so-called "strict aliasing" rule, which is undefined behaviour and might lead to bugs when compiler optimizations are enabled.
For more information on this topic, see https://blog.regehr.org/archives/959 http://alas.matf.bg.ac.rs/manuals/lspe/snode=153.html Review: https://reviews.apache.org/r/64686/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/5517db06 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/5517db06 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/5517db06 Branch: refs/heads/master Commit: 5517db067054327aeb333a8cc2678da218a4cc93 Parents: b44e362 Author: Alexander Rukletsov <ruklet...@gmail.com> Authored: Fri Dec 22 19:41:55 2017 +0100 Committer: Alexander Rukletsov <al...@apache.org> Committed: Fri Dec 22 19:46:25 2017 +0100 ---------------------------------------------------------------------- src/linux/ns.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/5517db06/src/linux/ns.cpp ---------------------------------------------------------------------- diff --git a/src/linux/ns.cpp b/src/linux/ns.cpp index 8b59ba7..be59d9c 100644 --- a/src/linux/ns.cpp +++ b/src/linux/ns.cpp @@ -18,8 +18,10 @@ #include <unistd.h> +#include <sys/socket.h> #include <sys/wait.h> +#include <cstring> #include <vector> #include <process/collect.hpp> @@ -394,7 +396,11 @@ Try<pid_t> clone( return Error("Bad control data received"); } - pid_t pid = ((struct ucred*) CMSG_DATA(CMSG_FIRSTHDR(&message)))->pid; + struct ucred cred; + std::memcpy( + &cred, CMSG_DATA(CMSG_FIRSTHDR(&message)), sizeof(struct ucred)); + + const pid_t pid = cred.pid; // Need to `waitpid` on child process to avoid a zombie. Note that // it's expected that the child will terminate quickly hence @@ -452,17 +458,20 @@ Try<pid_t> clone( stack.get(), flags, [=]() { - struct ucred* cred = reinterpret_cast<struct ucred*>( - CMSG_DATA(CMSG_FIRSTHDR(&message))); + struct ucred cred; + cred.pid = ::getpid(); + cred.uid = ::getuid(); + cred.gid = ::getgid(); // Now send back the pid and have it be translated appropriately // by the kernel to the enclosing pid namespace. // // NOTE: sending back the pid is best effort because we're going // to exit no matter what. - cred->pid = ::getpid(); - cred->uid = ::getuid(); - cred->gid = ::getgid(); + std::memcpy( + CMSG_DATA(CMSG_FIRSTHDR(&message)), + &cred, + sizeof(struct ucred)); if (sendmsg(sockets[1], &message, 0) == -1) { // Failed to send the pid back to the parent!