Mercurial > hg > dhcpcd
changeset 4946:c80386966f1f draft
privsep: Pad structs out so there are no uninited memory issues
Add #ifdef'd out debug code for them as well.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Wed, 08 Jan 2020 16:07:58 +0000 |
| parents | 9b5c1ee2fe77 |
| children | 5d4046aa9571 |
| files | src/privsep.c src/privsep.h |
| diffstat | 2 files changed, 44 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/src/privsep.c Wed Jan 08 15:58:57 2020 +0000 +++ b/src/privsep.c Wed Jan 08 16:07:58 2020 +0000 @@ -48,6 +48,7 @@ #include <errno.h> #include <fcntl.h> #include <grp.h> +#include <stddef.h> /* For offsetof, struct padding debug */ #include <signal.h> #include <stdlib.h> #include <string.h> @@ -480,6 +481,31 @@ .ps_datalen = msg->msg_iov[0].iov_len, }; +#if 0 /* For debugging structure padding. */ + logerrx("psa.addr %lu %zu", offsetof(struct ps_addr, psa_family), sizeof(psm.ps_id.psi_addr.psa_family)); + logerrx("psa.pad %lu %zu", offsetof(struct ps_addr, psa_pad), sizeof(psm.ps_id.psi_addr.psa_pad)); + logerrx("psa.psa_u %lu %zu", offsetof(struct ps_addr, psa_u), sizeof(psm.ps_id.psi_addr.psa_u)); + logerrx("psa %zu", sizeof(psm.ps_id.psi_addr)); + + logerrx("psi.addr %lu %zu", offsetof(struct ps_id, psi_addr), sizeof(psm.ps_id.psi_addr)); + logerrx("psi.index %lu %zu", offsetof(struct ps_id, psi_ifindex), sizeof(psm.ps_id.psi_ifindex)); + logerrx("psi.cmd %lu %zu", offsetof(struct ps_id, psi_cmd), sizeof(psm.ps_id.psi_cmd)); + logerrx("psi.pad %lu %zu", offsetof(struct ps_id, psi_pad), sizeof(psm.ps_id.psi_pad)); + logerrx("psi %zu", sizeof(struct ps_id)); + + logerrx("ps_cmd %lu", offsetof(struct ps_msghdr, ps_cmd)); + logerrx("ps_pad %lu %zu", offsetof(struct ps_msghdr, ps_pad), sizeof(psm.ps_pad)); + logerrx("ps_flags %lu %zu", offsetof(struct ps_msghdr, ps_flags), sizeof(psm.ps_flags)); + + logerrx("ps_id %lu %zu", offsetof(struct ps_msghdr, ps_id), sizeof(psm.ps_id)); + + logerrx("ps_namelen %lu %zu", offsetof(struct ps_msghdr, ps_namelen), sizeof(psm.ps_namelen)); + logerrx("ps_controllen %lu %zu", offsetof(struct ps_msghdr, ps_controllen), sizeof(psm.ps_controllen)); + logerrx("ps_pad2 %lu %zu", offsetof(struct ps_msghdr, ps_pad2), sizeof(psm.ps_pad2)); + logerrx("ps_datalen %lu %zu", offsetof(struct ps_msghdr, ps_datalen), sizeof(psm.ps_datalen)); + logerrx("psm %zu", sizeof(psm)); +#endif + return ps_sendpsmmsg(ctx, fd, &psm, msg); }
--- a/src/privsep.h Wed Jan 08 15:58:57 2020 +0000 +++ b/src/privsep.h Wed Jan 08 16:07:58 2020 +0000 @@ -72,6 +72,7 @@ struct ps_addr { sa_family_t psa_family; + uint8_t psa_pad[2]; union { struct in_addr psau_in_addr; struct in6_addr psau_in6_addr; @@ -85,6 +86,23 @@ struct ps_addr psi_addr; unsigned int psi_ifindex; uint8_t psi_cmd; + uint8_t psi_pad[3]; +}; + +struct ps_msghdr { + uint8_t ps_cmd; + uint8_t ps_pad[sizeof(unsigned long) - 1]; + unsigned long ps_flags; + struct ps_id ps_id; + socklen_t ps_namelen; + socklen_t ps_controllen; + uint8_t ps_pad2[sizeof(size_t) - sizeof(socklen_t)]; + size_t ps_datalen; +}; + +struct ps_msg { + struct ps_msghdr psm_hdr; + uint8_t psm_data[PS_BUFLEN]; }; struct ps_process { @@ -106,21 +124,6 @@ }; TAILQ_HEAD(ps_process_head, ps_process); -struct ps_msghdr { - uint8_t ps_cmd; - uint8_t ps_pad[sizeof(unsigned long) - 1]; - unsigned long ps_flags; - struct ps_id ps_id; - size_t ps_datalen; - socklen_t ps_namelen; - socklen_t ps_controllen; -}; - -struct ps_msg { - struct ps_msghdr psm_hdr; - uint8_t psm_data[PS_BUFLEN]; -}; - #include "privsep-inet.h" #include "privsep-root.h" #ifdef INET
