From f056fcda8bf9a5c375b20ef3803718187d9d4211 Mon Sep 17 00:00:00 2001 From: Luca Dariz Date: Mon, 16 Jan 2023 11:58:56 +0100 Subject: add conversion helpers for invalid mach port names * include/mach/port.h: add _NAME_ variants for port NULL and DEAD and add helpers to check for invalid port names * ipc/port.h: add helpers to properly convert to/from invalid mach port names. Message-Id: <20230116105857.240210-7-luca@orpolo.org> --- include/mach/port.h | 8 ++++++-- ipc/port.h | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/mach/port.h b/include/mach/port.h index e38be614..c9bbcf17 100644 --- a/include/mach/port.h +++ b/include/mach/port.h @@ -72,9 +72,13 @@ typedef int *rpc_signature_info_t; #define MACH_PORT_NULL 0 /* works with both user and kernel ports */ #define MACH_PORT_DEAD ((mach_port_t) ~0) +#define MACH_PORT_NAME_NULL ((mach_port_name_t) 0) +#define MACH_PORT_NAME_DEAD ((mach_port_name_t) ~0) -#define MACH_PORT_VALID(name) \ - (((name) != MACH_PORT_NULL) && ((name) != MACH_PORT_DEAD)) +#define MACH_PORT_VALID(port) \ + (((port) != MACH_PORT_NULL) && ((port) != MACH_PORT_DEAD)) +#define MACH_PORT_NAME_VALID(name) \ + (((name) != MACH_PORT_NAME_NULL) && ((name) != MACH_PORT_NAME_DEAD)) /* * These are the different rights a task may have. diff --git a/ipc/port.h b/ipc/port.h index 9ef586c1..c85685d7 100644 --- a/ipc/port.h +++ b/ipc/port.h @@ -39,6 +39,7 @@ #ifndef _IPC_PORT_H_ #define _IPC_PORT_H_ +#include #include /* @@ -83,4 +84,23 @@ typedef mach_port_name_t mach_port_gen_t; /* generation numbers */ #define MACH_PORT_UREFS_UNDERFLOW(urefs, delta) \ (((delta) < 0) && (-(delta) > (urefs))) + +static inline mach_port_t invalid_name_to_port(mach_port_name_t name) +{ + if (name == MACH_PORT_NAME_NULL) + return MACH_PORT_NULL; + if (name == MACH_PORT_NAME_DEAD) + return MACH_PORT_DEAD; + panic("invalid_name_to_port() called with a valid port"); +} + +static inline mach_port_name_t invalid_port_to_name(mach_port_t port) +{ + if (port == MACH_PORT_NULL) + return MACH_PORT_NAME_NULL; + if (port == MACH_PORT_DEAD) + return MACH_PORT_NAME_DEAD; + panic("invalid_port_to_name() called with a valid name"); +} + #endif /* _IPC_PORT_H_ */ -- cgit v1.2.3