PCSC那事儿(十五--SCardFreeMemory)

 

SCardFreeMemory

定义在 winscard_clnt.c

实现如下:

3321 LONG SCardFreeMemory(SCARDCONTEXT hContext, LPCVOID pvMem)

3322 {

3323         LONG rv = SCARD_S_SUCCESS;

3324         LONG dwContextIndex;

3325

3326         PROFILE_START

3327

3328         rv = SCardCheckDaemonAvailability();

3329         if (rv != SCARD_S_SUCCESS)

3330                 return rv;

3331

3332         /*

3333          * Make sure this context has been opened

3334          */

3335         dwContextIndex = SCardGetContextIndice(hContext);

3336         if (dwContextIndex == -1)

3337                 return SCARD_E_INVALID_HANDLE;

3338

3339         free((void *)pvMem);

3340

3341         PROFILE_END(rv)

3342

3343         return rv;

3344 }

 

 

实际上 SCardFreeMemory 必然也是 free 些资源 . 但是毕竟是 ResourceManager 给你分了内存,所以得有些特殊处理。

SCardCheckDaemonAvailability 检查 pcscd 是否还活着。如果 pcscd 不在了,

testpcsc 可以不用归还内存了。如果在这之前,有其它线程调用了, SCardReleaseContext

说明这个上下文结束了。可以选择不归还,直接退出客户端。如果不退出客户端,而是重新

SCardEstablishContext, 重新来过,则内存泄露。

SCardCheckDaemonAvailability 的内部处理,在前面说过了,还有服务端重启,客户端 clone 自己。

都不会返回 SCARD_S_SUCCESS, 从而新 clone 出的客户端程序内存泄露。而服务器重启,直接引起这里的内存泄露。

 

SCardListReaderGroups 结束。

 

 

回到 testpcsc.c

141 wait_for_card_again:

142         mszGroups = NULL;

143         printf("Testing SCardListReaders/t: ");

144         rv = SCardListReaders(hContext, mszGroups, NULL, &dwReaders);

145         test_rv(rv, hContext, DONT_PANIC);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值