2015.07.02-IPC对象释放失败

【问题现象】
任务测试完成后释放MUTEX和EVENT失败。
【定位过程】

释放对象时发现所释放对象的Pool ID不正确而无法释放,Pool ID属于对象HANDLE成员中的b11:20

#define     OBJECT_SID_BITS         11
#define     OBJECT_PID_BITS         10
#define     OBJECT_TID_BITS         3
#define     OBJECT_CID_BITS         5
#define     OBJECT_STS_BITS         2
#define     OBJECT_USR_BITS         1

typedef struct tagHANDLE_BITS{
    HANDLE              ObjectSid: OBJECT_SID_BITS;                /**< Object sn */
    HANDLE              ObjectPid: OBJECT_PID_BITS;                /**< Pool id */
    HANDLE              ObjectTid: OBJECT_TID_BITS;                /**< Table id */
    HANDLE              ObjectCid: OBJECT_CID_BITS;                /**< Class id */
    HANDLE              ObjectState: OBJECT_STS_BITS;              /**< Object state*/
    HANDLE              ObjectUser: OBJECT_USR_BITS;
}HANDLE_BITS;
struct tagKOBJECT_HEADER{
    union{
        HANDLE_BITS     Bits;
        HANDLE          Handle;
    }uh;
    LIST_HEAD           HashNode;
    union{
        CHAR            caName[OBJECT_NAME_MAX];
        DWORD           daName[OBJECT_NAME_MAX/sizeof(DWORD)];
        DWORD           daMagic[OBJECT_NAME_MAX/sizeof(DWORD)];
    }un;
};

增加打印发现释放时Pool ID值为1023,但释放前对象有效性判断已通过,表明有效性判断Pool ID正确。排查代码发现调用CORE_PoolFreeBlock前已将对象HANDLE的值设置为无效,导致通过对象HANDLE取Pool ID出错。


【问题原因】
KOBJECT_HEADER::uh.Handle 在释放前被置无效,释放时通过该Handle获得的Pool ID也无效。
【解决方案】
先取Pool ID 再置对象句柄无效。

    Pid = GetObjectPid(lpHeader);
    SetObjectHandle(lpHeader, INVALID_HANDLE_VALUE);
    DetachObject(lpHeader);

    return CORE_PoolFreeBlock(lpManager, Pid);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值