From fd8be99b90fd9d925b310af13e0050b069067d90 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Tue, 2 Apr 2002 04:01:27 +0000 Subject: [PATCH] 2002-03-31 Roland McGrath * hurd/hurdselect.c (_hurd_select): Fix MACH_MSG_TYPE_INTEGER_T -> integer_t in sizeof. Use a union rather than casts to compare mach_msg_type_t as int. --- hurd/hurdselect.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c index c3dfb52119..32cd22f9f6 100644 --- a/hurd/hurdselect.c +++ b/hurd/hurdselect.c @@ -64,6 +64,14 @@ _hurd_select (int nfds, } d[nfds]; sigset_t oset; + union typeword /* Use this to avoid unkosher casts. */ + { + mach_msg_type_t type; + uint32_t word; + }; + assert (sizeof (union typeword) == sizeof (mach_msg_type_t)); + assert (sizeof (uint32_t) == sizeof (mach_msg_type_t)); + if (sigmask && __sigprocmask (SIG_SETMASK, sigmask, &oset)) return -1; @@ -282,15 +290,15 @@ _hurd_select (int nfds, struct { mach_msg_header_t head; - mach_msg_type_t err_type; + union typeword err_type; error_t err; } error; struct { mach_msg_header_t head; - mach_msg_type_t err_type; + union typeword err_type; error_t err; - mach_msg_type_t result_type; + union typeword result_type; int result; } success; } msg; @@ -303,13 +311,14 @@ _hurd_select (int nfds, { /* We got a message. Decode it. */ #define IO_SELECT_REPLY_MSGID (21012 + 100) /* XXX */ - const mach_msg_type_t inttype = - { MACH_MSG_TYPE_INTEGER_T, sizeof (MACH_MSG_TYPE_INTEGER_T) * 8, - 1, 1, 0, 0 }; + const union typeword inttype = + { type: + { MACH_MSG_TYPE_INTEGER_T, sizeof (integer_t) * 8, 1, 1, 0, 0 } + }; if (msg.head.msgh_id == IO_SELECT_REPLY_MSGID && msg.head.msgh_size >= sizeof msg.error && !(msg.head.msgh_bits & MACH_MSGH_BITS_COMPLEX) && - *(int *) &msg.error.err_type == *(int *) &inttype) + msg.error.err_type.word == inttype.word) { /* This is a properly formatted message so far. See if it is a success or a failure. */ @@ -323,7 +332,7 @@ _hurd_select (int nfds, } if (msg.error.err || msg.head.msgh_size != sizeof msg.success || - *(int *) &msg.success.result_type != *(int *) &inttype || + msg.success.result_type.word != inttype.word || (msg.success.result & SELECT_ALL) == 0) { /* Error or bogus reply. Simulate readiness. */