Security 为什么IOKit在lck_mtx_锁定/lck_mtx_解锁后会导致竞态条件

Security 为什么IOKit在lck_mtx_锁定/lck_mtx_解锁后会导致竞态条件,security,race-condition,iokit,Security,Race Condition,Iokit,在userland中使用iokit对象句柄执行某些操作时,例如IOConnectCallmethod 通过mach_msg进入内核,mach_陷阱之一 (与其他MIG调用相同)->util在调用之前是_io_connect_方法,有一个将ipc_端口转换为iokit对象的操作 connection = iokit_lookup_connect_port(In0P->Head.msgh_request_port); 内部的iokit_查找_连接_端口: MIGEXTERN io_objec

在userland中使用iokit对象句柄执行某些操作时,例如IOConnectCallmethod

通过mach_msg进入内核,mach_陷阱之一

(与其他MIG调用相同)->util在调用之前是_io_connect_方法,有一个将ipc_端口转换为iokit对象的操作

connection = iokit_lookup_connect_port(In0P->Head.msgh_request_port);
内部的iokit_查找_连接_端口:

MIGEXTERN io_object_t
iokit_lookup_connect_port( ipc_port_t   port){
register io_object_t    obj;

if (!IP_VALID(port))
    return (NULL);

iokit_lock_port(port);
if (ip_active(port) && (ip_kotype(port) == IKOT_IOKIT_CONNECT)) {
    obj = (io_object_t) port->ip_kobject;
    iokit_add_connect_reference( obj );
}
else
    obj = NULL;

iokit_unlock_port(port);

return( obj );
}
每次成功调用都必须调用iokit\u lock\u端口和iokit\u unlock\u端口

EXTERN void
iokit_lock_port( __unused ipc_port_t port )
{
    lck_mtx_lock(&iokit_obj_to_port_binding_lock);
}

EXTERN void
iokit_unlock_port( __unused ipc_port_t port )
{
    lck_mtx_unlock(&iokit_obj_to_port_binding_lock);
}
但为什么即使调用相同的IOKit方法也会导致竞争条件

我试过如果我在IOKit方法中添加了锁的代码,或者在竞争条件的方法之前,锁可以保护成功, 但为什么在iokit\U lock\U port/iokit\U unlock\U port中无法锁定