OSEC

Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com
[Muscle] bug in SCardReleaseContext?

From: Eric Walter (eric.waltermed-i-bit.de)
Date: Fri Feb 15 2008 - 17:28:40 CST


Hi,

it seems SCardReleaseContext will just return SCARD_E_NO_SERVICE and
skip removing the local context if the daemon is not running. From
pcsc-lite-1.4.99-svn-2812:

> LONG SCardReleaseContext(SCARDCONTEXT hContext)
> {
...
> if (SCardCheckDaemonAvailability() != SCARD_S_SUCCESS)
> return SCARD_E_NO_SERVICE;
...
> SCardLockThread();
> SCardRemoveContext(hContext);
> SCardUnlockThread();
>
> PROFILE_END
>
> return scReleaseStruct.rv;
> }

Now, an application might at a later time try to allocate a new
context successfully if the daemon ist alive again. If this happens a
couple of times, it seems like the slots for contexts will be
exhausted and SCardEstablishContext() will then fail. So wouldn't it
seem to be the proper thing to do the SCardRemoveContext() regardless
of daemon availability?

Older PCSC-Lite versions appear to have been meant to behave like I
outlined. Though in the case of winscard_clnt.c in Mac OS X 10.4.x it
didn't work because local rv was not initialized to zero:

> static LONG SCardReleaseContextTH(SCARDCONTEXT hContext)
> {
> LONG contextIndice;
> LONG rv;
>
> /*
> * Make sure this context has been opened
> */
> contextIndice = SCardGetContextIndice(hContext);
> if (contextIndice == -1)
> return SCARD_E_INVALID_HANDLE;
>
> /* We only need to tell pcscd about the context going away if
> pcscd knows
> about it in the first place. This is only the case when the
> context
> is connected. */
> if (psContextMap[contextIndice].contextConnectStatus
> == CONTEXT_STATUS_CONNECTED)
> {
...
> }
>
> if (!rv)
> {
> psContextMap[contextIndice].hServerContext = 0;
> /* Cancel any pending SCardGetStatusChange() calls. */
> psContextMap[contextIndice].contextBlockStatus =
> BLOCK_STATUS_RESUME;
> psContextMap[contextIndice].contextConnectStatus =
> CONTEXT_STATUS_FREE;
> psContextMap[contextIndice].dwScope = 0;

Regards,

Eric

_______________________________________________
Muscle mailing list
Musclelists.musclecard.com
http://lists.drizzle.com/mailman/listinfo/muscle