Remove undocumented voodoo in SCardGetStatusChange() as it causes the

system version to return immediately, causing CPU intensive loops.


git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/rdesktop/trunk@1594 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Pierre Ossman 2010-06-14 07:35:00 +00:00
parent a22d20b871
commit 4635dfc148

86
scard.c
View File

@ -32,6 +32,9 @@
#include <wintypes.h> #include <wintypes.h>
#include <pcsclite.h> #include <pcsclite.h>
#include <winscard.h> #include <winscard.h>
#ifdef PCSCLITE_VERSION_NUMBER
#include <reader.h>
#endif
#endif /* PCSC_OSX */ #endif /* PCSC_OSX */
#include "rdesktop.h" #include "rdesktop.h"
#include "scard.h" #include "scard.h"
@ -965,21 +968,6 @@ mappedStatus(MYPCSC_DWORD code)
} }
#endif #endif
static MYPCSC_DWORD
incStatus(MYPCSC_DWORD code, RD_BOOL mapped)
{
if (mapped || (code & SCARD_STATE_CHANGED))
{
MYPCSC_DWORD count = (code >> 16) & 0x0000FFFF;
count++;
if (mapped && !(count % 2))
count++;
return (code & 0x0000FFFF) | (count << 16);
}
else
return code;
}
static void static void
copyReaderState_MyPCSCToServer(MYPCSC_LPSCARD_READERSTATE_A src, SERVER_LPSCARD_READERSTATE_A dst, copyReaderState_MyPCSCToServer(MYPCSC_LPSCARD_READERSTATE_A src, SERVER_LPSCARD_READERSTATE_A dst,
MYPCSC_DWORD readerCount) MYPCSC_DWORD readerCount)
@ -1027,13 +1015,9 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
SERVER_DWORD dwTimeout; SERVER_DWORD dwTimeout;
SERVER_DWORD dwCount; SERVER_DWORD dwCount;
SERVER_LPSCARD_READERSTATE_A rsArray, cur; SERVER_LPSCARD_READERSTATE_A rsArray, cur;
SERVER_DWORD *stateArray = NULL, *curState;
MYPCSC_LPSCARD_READERSTATE_A myRsArray; MYPCSC_LPSCARD_READERSTATE_A myRsArray;
long i; long i;
PMEM_HANDLE lcHandle = NULL; PMEM_HANDLE lcHandle = NULL;
#if 0
RD_BOOL mapped = False;
#endif
in->p += 0x18; in->p += 0x18;
in_uint32_le(in, dwTimeout); in_uint32_le(in, dwTimeout);
@ -1051,9 +1035,6 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
if (!rsArray) if (!rsArray)
return SC_returnNoMemoryError(&lcHandle, in, out); return SC_returnNoMemoryError(&lcHandle, in, out);
memset(rsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A)); memset(rsArray, 0, dwCount * sizeof(SERVER_SCARD_READERSTATE_A));
stateArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_DWORD));
if (!stateArray)
return SC_returnNoMemoryError(&lcHandle, in, out);
/* skip two pointers at beginning of struct */ /* skip two pointers at beginning of struct */
for (i = 0, cur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2); for (i = 0, cur = (SERVER_LPSCARD_READERSTATE_A) ((unsigned char **) rsArray + 2);
i < dwCount; i++, cur++) i < dwCount; i++, cur++)
@ -1062,8 +1043,7 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
in_uint8a(in, cur, SERVER_SCARDSTATESIZE); in_uint8a(in, cur, SERVER_SCARDSTATESIZE);
} }
for (i = 0, cur = rsArray, curState = stateArray; for (i = 0, cur = rsArray; i < dwCount; i++, cur++)
i < dwCount; i++, cur++, curState++)
{ {
SERVER_DWORD dataLength; SERVER_DWORD dataLength;
@ -1072,31 +1052,6 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
cur->dwEventState = swap32(cur->dwEventState); cur->dwEventState = swap32(cur->dwEventState);
cur->cbAtr = swap32(cur->cbAtr); cur->cbAtr = swap32(cur->cbAtr);
/* reset Current state hign bytes; */
*curState = cur->dwCurrentState;
cur->dwCurrentState &= 0x0000FFFF;
cur->dwEventState &= 0x0000FFFF;
#if 0
if (cur->dwCurrentState == (SCARD_STATE_CHANGED | SCARD_STATE_PRESENT))
{
cur->dwCurrentState = 0x00000000;
mapped = True;
}
if (mappedStatus(*curState))
{
cur->dwCurrentState &= ~SCARD_STATE_INUSE;
cur->dwEventState &= ~SCARD_STATE_INUSE;
if (cur->dwCurrentState & SCARD_STATE_EMPTY)
{
cur->dwCurrentState &= ~SCARD_STATE_EMPTY;
cur->dwCurrentState |= SCARD_STATE_UNKNOWN;
}
}
#endif
in->p += 0x08; in->p += 0x08;
in_uint32_le(in, dataLength); in_uint32_le(in, dataLength);
inRepos(in, inRepos(in,
@ -1110,14 +1065,11 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n", DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState, (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,
(unsigned) cur->dwEventState)); (unsigned) cur->dwEventState));
DEBUG_SCARD(("SCARD: current state: 0x%08x\n",
(unsigned) *curState));
} }
} }
else else
{ {
rsArray = NULL; rsArray = NULL;
stateArray = NULL;
} }
myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A)); myRsArray = SC_xmalloc(&lcHandle, dwCount * sizeof(MYPCSC_SCARD_READERSTATE_A));
@ -1144,36 +1096,8 @@ TS_SCardGetStatusChange(STREAM in, STREAM out, RD_BOOL wide)
out_uint32_le(out, 0x00084dd8); out_uint32_le(out, 0x00084dd8);
out_uint32_le(out, dwCount); out_uint32_le(out, dwCount);
for (i = 0, cur = rsArray, curState = stateArray; i < dwCount; i++, cur++, curState++) for (i = 0, cur = rsArray; i < dwCount; i++, cur++)
{ {
cur->dwCurrentState = (*curState);
cur->dwEventState |= (*curState) & 0xFFFF0000;
#if 0
if (mapped && (cur->dwCurrentState & SCARD_STATE_PRESENT)
&& (cur->dwCurrentState & SCARD_STATE_CHANGED)
&& (cur->dwEventState & SCARD_STATE_PRESENT)
&& (cur->dwEventState & SCARD_STATE_CHANGED))
{
cur->dwEventState |= SCARD_STATE_INUSE;
}
else if (cur->dwEventState & SCARD_STATE_UNKNOWN)
{
cur->dwEventState &= ~SCARD_STATE_UNKNOWN;
cur->dwEventState |= SCARD_STATE_EMPTY;
mapped = True;
}
else if ((!mapped) && (cur->dwEventState & SCARD_STATE_INUSE))
{
mapped = True;
cur->dwEventState &= ~SCARD_STATE_INUSE;
}
cur->dwEventState = incStatus(cur->dwEventState, mapped);
#endif
cur->dwEventState = incStatus(cur->dwEventState, False);
DEBUG_SCARD(("SCARD: \"%s\"\n", cur->szReader ? cur->szReader : "NULL")); DEBUG_SCARD(("SCARD: \"%s\"\n", cur->szReader ? cur->szReader : "NULL"));
DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n", DEBUG_SCARD(("SCARD: user: 0x%08x, state: 0x%08x, event: 0x%08x\n",
(unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState, (unsigned) cur->pvUserData, (unsigned) cur->dwCurrentState,