Hello, About the port leak in select discussed on IRC, I checked history a bit, this (000ef460744786571f51604e6de631b7168e239a):
- if (d[i].type) + if (d[i].type & ~SELECT_ERROR) __mach_port_destroy (__mach_task_self (), d[i].reply_port); was added when handling EBADF , for which there is no reply port to destroy. Then I added this (099f8d2b7ecedc4f6fc895d2c35912f995289c24): - if (d[i].type & ~SELECT_ERROR) + if (d[i].type & ~(SELECT_ERROR | SELECT_RETURNED)) __mach_port_destroy (__mach_task_self (), d[i].reply_port); For the case where io_select returns an error. Yesterday evening I didn't remember which case this was, but IIRC that's when a tty gets io_revoke()d, in which case the RPC doesn't happen at all since the target port was destroyed. I guess we could simply do this: for (i = firstfd; i <= lastfd; ++i) - if (d[i].type & ~SELECT_ERROR) + if (d[i].type & SELECT_ERROR) + { + d[i].reply_port = MACH_PORT_NULL; + } else { int type = d[i].type; d[i].reply_port = __mach_reply_port (); as well as in the error case of __io_select_request, and then just check against MACH_PORT_NULL before destroy. Samuel