From: Dmitry V. Levin Date: Sun, 25 Dec 2016 00:30:28 +0000 (+0000) Subject: msghdr: change cmsghdr size types from size_t to unsigned int X-Git-Tag: v4.16~185 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=27cc81d61f8fc43a6473cf9b639b5a3182e59898;p=strace msghdr: change cmsghdr size types from size_t to unsigned int As the kernel does not accept control messages longer than the value of int sysctl_optmem_max kernel variable exported as /proc/sys/net/core/optmem_max, we do not print them either. Since unsigned int has enough room to contain any valid control message size, change all internal cmsghdr size types from size_t to unsigned int. * msghdr.c (print_scm_rights, print_scm_creds, print_scm_security, print_cmsg_ip_pktinfo, print_cmsg_uint, print_cmsg_uint8_t, print_cmsg_ip_opts, print_cmsg_ip_recverr, print_cmsg_ip_origdstaddr, cmsg_printer, print_cmsg_type_data): Change data_len argument type from size_t to unsigned int. (cmsg_socket_printers): Change min_len type from size_t to unsigned int. (decode_msg_control): Change the type of in_control_len argument, cmsg_len, and len variables from size_t to kernel_ureg_t. Change the type of cmsg_size, control_len, and buf_len variables from size_t to unsigned int. --- diff --git a/msghdr.c b/msghdr.c index da99e55f..cdd037cd 100644 --- a/msghdr.c +++ b/msghdr.c @@ -56,11 +56,12 @@ typedef union { } union_cmsghdr; static void -print_scm_rights(struct tcb *tcp, const void *cmsg_data, const size_t data_len) +print_scm_rights(struct tcb *tcp, const void *cmsg_data, + const unsigned int data_len) { const int *fds = cmsg_data; - const size_t nfds = data_len / sizeof(*fds); - size_t i; + const unsigned int nfds = data_len / sizeof(*fds); + unsigned int i; tprints("["); @@ -78,7 +79,8 @@ print_scm_rights(struct tcb *tcp, const void *cmsg_data, const size_t data_len) } static void -print_scm_creds(struct tcb *tcp, const void *cmsg_data, const size_t data_len) +print_scm_creds(struct tcb *tcp, const void *cmsg_data, + const unsigned int data_len) { const struct ucred *uc = cmsg_data; @@ -88,14 +90,14 @@ print_scm_creds(struct tcb *tcp, const void *cmsg_data, const size_t data_len) static void print_scm_security(struct tcb *tcp, const void *cmsg_data, - const size_t data_len) + const unsigned int data_len) { print_quoted_string(cmsg_data, data_len, 0); } static void print_cmsg_ip_pktinfo(struct tcb *tcp, const void *cmsg_data, - const size_t data_len) + const unsigned int data_len) { const struct in_pktinfo *info = cmsg_data; @@ -108,7 +110,8 @@ print_cmsg_ip_pktinfo(struct tcb *tcp, const void *cmsg_data, } static void -print_cmsg_uint(struct tcb *tcp, const void *cmsg_data, const size_t data_len) +print_cmsg_uint(struct tcb *tcp, const void *cmsg_data, + const unsigned int data_len) { const unsigned int *p = cmsg_data; @@ -117,7 +120,7 @@ print_cmsg_uint(struct tcb *tcp, const void *cmsg_data, const size_t data_len) static void print_cmsg_uint8_t(struct tcb *tcp, const void *cmsg_data, - const size_t data_len) + const unsigned int data_len) { const uint8_t *p = cmsg_data; @@ -126,10 +129,10 @@ print_cmsg_uint8_t(struct tcb *tcp, const void *cmsg_data, static void print_cmsg_ip_opts(struct tcb *tcp, const void *cmsg_data, - const size_t data_len) + const unsigned int data_len) { const unsigned char *opts = cmsg_data; - size_t i; + unsigned int i; tprints("["); for (i = 0; i < data_len; ++i) { @@ -157,7 +160,7 @@ struct sock_ee { static void print_cmsg_ip_recverr(struct tcb *tcp, const void *cmsg_data, - const size_t data_len) + const unsigned int data_len) { const struct sock_ee *const err = cmsg_data; @@ -171,20 +174,20 @@ print_cmsg_ip_recverr(struct tcb *tcp, const void *cmsg_data, static void print_cmsg_ip_origdstaddr(struct tcb *tcp, const void *cmsg_data, - const size_t data_len) + const unsigned int data_len) { - const int addr_len = + const unsigned int addr_len = data_len > sizeof(struct sockaddr_storage) ? sizeof(struct sockaddr_storage) : data_len; print_sockaddr(tcp, cmsg_data, addr_len); } -typedef void (* const cmsg_printer)(struct tcb *, const void *, size_t); +typedef void (* const cmsg_printer)(struct tcb *, const void *, unsigned int); static const struct { const cmsg_printer printer; - const size_t min_len; + const unsigned int min_len; } cmsg_socket_printers[] = { [SCM_RIGHTS] = { print_scm_rights, sizeof(int) }, [SCM_CREDENTIALS] = { print_scm_creds, sizeof(struct ucred) }, @@ -203,7 +206,7 @@ static const struct { static void print_cmsg_type_data(struct tcb *tcp, const int cmsg_level, const int cmsg_type, - const void *cmsg_data, const size_t data_len) + const void *cmsg_data, const unsigned int data_len) { const unsigned int utype = cmsg_type; switch (cmsg_level) { @@ -250,22 +253,21 @@ get_optmem_max(void) static void decode_msg_control(struct tcb *const tcp, const kernel_ureg_t addr, - const size_t in_control_len) + const kernel_ureg_t in_control_len) { if (!in_control_len) return; tprints(", msg_control="); - const size_t cmsg_size = + const unsigned int cmsg_size = #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 (current_wordsize < sizeof(long)) ? sizeof(struct cmsghdr32) : #endif sizeof(struct cmsghdr); - size_t control_len = - in_control_len > get_optmem_max() - ? get_optmem_max() : in_control_len; - size_t buf_len = control_len; + unsigned int control_len = in_control_len > get_optmem_max() + ? get_optmem_max() : in_control_len; + unsigned int buf_len = control_len; char *buf = buf_len < cmsg_size ? NULL : malloc(buf_len); if (!buf || umoven(tcp, addr, buf_len, buf) < 0) { printaddr(addr); @@ -277,7 +279,7 @@ decode_msg_control(struct tcb *const tcp, const kernel_ureg_t addr, tprints("["); while (buf_len >= cmsg_size) { - const size_t cmsg_len = + const kernel_ureg_t cmsg_len = #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4 (current_wordsize < sizeof(long)) ? u.cmsg32->cmsg_len : #endif @@ -299,7 +301,7 @@ decode_msg_control(struct tcb *const tcp, const kernel_ureg_t addr, printxval(socketlayers, cmsg_level, "SOL_???"); tprints(", cmsg_type="); - size_t len = cmsg_len > buf_len ? buf_len : cmsg_len; + kernel_ureg_t len = cmsg_len > buf_len ? buf_len : cmsg_len; print_cmsg_type_data(tcp, cmsg_level, cmsg_type, (const void *) (u.ptr + cmsg_size), @@ -311,7 +313,7 @@ decode_msg_control(struct tcb *const tcp, const kernel_ureg_t addr, break; } len = (cmsg_len + current_wordsize - 1) & - (size_t) ~(current_wordsize - 1); + ~((kernel_ureg_t) current_wordsize - 1); if (len >= buf_len) { buf_len = 0; break;