channels/smartcard: cleanup

This commit is contained in:
Marc-André Moreau 2014-04-05 19:58:48 -04:00
parent 9de2a85f6a
commit 368486dd13
1 changed files with 17 additions and 149 deletions

View File

@ -282,82 +282,6 @@ static UINT32 handle_RedirHandleRef(SMARTCARD_DEVICE* smartcard, IRP* irp, SCARD
return 0; return 0;
} }
static BOOL check_reader_is_forwarded(SMARTCARD_DEVICE* smartcard, const char* readerName)
{
BOOL rc = TRUE;
char *name = _strdup(readerName);
char *str, *strpos=NULL, *strstatus=NULL;
long pos, cpos, ret;
/* Extract the name, position and status from the data provided. */
str = strtok(name, " ");
while(str)
{
strpos = strstatus;
strstatus = str;
str = strtok(NULL, " ");
}
if (!strpos)
goto finally;
pos = strtol(strpos, NULL, 10);
if (strpos && strstatus)
{
/* Check, if the name of the reader matches. */
if (smartcard->name && strncmp(smartcard->name, readerName, strlen(smartcard->name)))
rc = FALSE;
/* Check, if the position matches. */
if (smartcard->path)
{
ret = sscanf(smartcard->path, "%ld", &cpos);
if ((1 == ret) && (cpos != pos))
rc = FALSE;
}
}
else
{
DEBUG_WARN("unknown reader format '%s'", readerName);
}
finally:
free(name);
if (!rc)
DEBUG_WARN("reader '%s' not forwarded", readerName);
return rc;
}
static BOOL check_handle_is_forwarded(SMARTCARD_DEVICE* smartcard, SCARDHANDLE hCard, SCARDCONTEXT hContext)
{
BOOL rc = FALSE;
LONG status;
DWORD state = 0, protocol = 0;
DWORD readerLen;
DWORD atrLen = SCARD_ATR_LENGTH;
char* readerName = NULL;
BYTE pbAtr[SCARD_ATR_LENGTH];
readerLen = SCARD_AUTOALLOCATE;
status = SCardStatusA(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
if (status == SCARD_S_SUCCESS)
{
rc = check_reader_is_forwarded(smartcard, readerName);
if (!rc)
DEBUG_WARN("Reader '%s' not forwarded!", readerName);
}
SCardFreeMemory(hContext, readerName);
return rc;
}
static UINT32 smartcard_output_string(IRP* irp, char* src, BOOL wide) static UINT32 smartcard_output_string(IRP* irp, char* src, BOOL wide)
{ {
BYTE* p; BYTE* p;
@ -859,13 +783,6 @@ UINT32 handle_ConnectA(SMARTCARD_DEVICE* smartcard, IRP* irp)
if (status) if (status)
goto finish; goto finish;
if (!check_reader_is_forwarded(smartcard, (char*) call.szReader))
{
DEBUG_WARN("Reader '%s' not forwarded!", call.szReader);
status = SCARD_E_INVALID_TARGET;
goto finish;
}
status = SCardConnectA(hContext, (char*) call.szReader, (DWORD) call.Common.dwShareMode, status = SCardConnectA(hContext, (char*) call.szReader, (DWORD) call.Common.dwShareMode,
(DWORD) call.Common.dwPreferredProtocols, &hCard, (DWORD*) &ret.dwActiveProtocol); (DWORD) call.Common.dwPreferredProtocols, &hCard, (DWORD*) &ret.dwActiveProtocol);
@ -955,12 +872,6 @@ static UINT32 handle_Reconnect(SMARTCARD_DEVICE* smartcard, IRP* irp)
if (status) if (status)
return status; return status;
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
return SCARD_E_INVALID_TARGET;
}
status = SCardReconnect(hCard, (DWORD) call.dwShareMode, (DWORD) call.dwPreferredProtocols, status = SCardReconnect(hCard, (DWORD) call.dwShareMode, (DWORD) call.dwPreferredProtocols,
(DWORD) call.dwInitialization, (LPDWORD) &ret.dwActiveProtocol); (DWORD) call.dwInitialization, (LPDWORD) &ret.dwActiveProtocol);
@ -996,12 +907,6 @@ static UINT32 handle_Disconnect(SMARTCARD_DEVICE* smartcard, IRP* irp)
if (status) if (status)
return status; return status;
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
return SCARD_E_INVALID_TARGET;
}
status = SCardDisconnect(hCard, (DWORD) call.dwDisposition); status = SCardDisconnect(hCard, (DWORD) call.dwDisposition);
ZeroMemory(&smartcard->hCard, sizeof(smartcard->hCard)); ZeroMemory(&smartcard->hCard, sizeof(smartcard->hCard));
@ -1037,12 +942,6 @@ static UINT32 handle_BeginTransaction(SMARTCARD_DEVICE* smartcard, IRP* irp)
if (status) if (status)
return status; return status;
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
return SCARD_E_INVALID_TARGET;
}
status = SCardBeginTransaction(hCard); status = SCardBeginTransaction(hCard);
smartcard_output_alignment(irp, 8); smartcard_output_alignment(irp, 8);
@ -1076,12 +975,6 @@ static UINT32 handle_EndTransaction(SMARTCARD_DEVICE* smartcard, IRP* irp)
if (status) if (status)
return status; return status;
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
return SCARD_E_INVALID_TARGET;
}
status = SCardEndTransaction(hCard, call.dwDisposition); status = SCardEndTransaction(hCard, call.dwDisposition);
smartcard_output_alignment(irp, 8); smartcard_output_alignment(irp, 8);
@ -1121,13 +1014,6 @@ static UINT32 handle_State(SMARTCARD_DEVICE* smartcard, IRP* irp)
if (status) if (status)
goto finish; goto finish;
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
status = SCARD_E_INVALID_TARGET;
goto finish;
}
readerLen = SCARD_AUTOALLOCATE; readerLen = SCARD_AUTOALLOCATE;
ret.rgAtr = atr; ret.rgAtr = atr;
@ -1196,16 +1082,9 @@ static DWORD handle_Status(SMARTCARD_DEVICE* smartcard, IRP* irp, BOOL wide)
if (status) if (status)
goto finish; goto finish;
if (!check_handle_is_forwarded(smartcard, hCard, hContext)) pbAtr = (BYTE*) malloc(atrLen);
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
status = SCARD_E_INVALID_TARGET;
goto finish;
}
pbAtr = malloc(sizeof(BYTE) * atrLen);
readerLen = SCARD_AUTOALLOCATE; readerLen = SCARD_AUTOALLOCATE;
status = SCardStatusA(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen); status = SCardStatusA(hCard, (LPSTR) &readerName, &readerLen, &state, &protocol, pbAtr, &atrLen);
if (status != SCARD_S_SUCCESS) if (status != SCARD_S_SUCCESS)
@ -1453,13 +1332,6 @@ static UINT32 handle_Transmit(SMARTCARD_DEVICE* smartcard, IRP* irp)
pPioRecvPci = NULL; pPioRecvPci = NULL;
} }
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
status = SCARD_E_INVALID_TARGET;
goto finish;
}
status = SCardTransmit(hCard, ioSendPci.rq, sendBuf, cbSendLength, status = SCardTransmit(hCard, ioSendPci.rq, sendBuf, cbSendLength,
pPioRecvPci, recvBuf, &cbRecvLength); pPioRecvPci, recvBuf, &cbRecvLength);
@ -1558,21 +1430,14 @@ static UINT32 handle_Control(SMARTCARD_DEVICE* smartcard, IRP* irp)
goto finish; goto finish;
} }
call.pvInBuffer = malloc(length); call.pvInBuffer = (BYTE*) malloc(length);
call.cbInBufferSize = length; call.cbInBufferSize = length;
Stream_Read(irp->input, call.pvInBuffer, length); Stream_Read(irp->input, call.pvInBuffer, length);
} }
ret.cbOutBufferSize = call.cbOutBufferSize; ret.cbOutBufferSize = call.cbOutBufferSize;
ret.pvOutBuffer = malloc(call.cbOutBufferSize); ret.pvOutBuffer = (BYTE*) malloc(call.cbOutBufferSize);
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
status = SCARD_E_INVALID_TARGET;
goto finish;
}
status = SCardControl(hCard, (DWORD) call.dwControlCode, status = SCardControl(hCard, (DWORD) call.dwControlCode,
call.pvInBuffer, (DWORD) call.cbInBufferSize, call.pvInBuffer, (DWORD) call.cbInBufferSize,
@ -1629,14 +1494,7 @@ static UINT32 handle_GetAttrib(SMARTCARD_DEVICE* smartcard, IRP* irp)
if (status) if (status)
return status; return status;
if (!check_handle_is_forwarded(smartcard, hCard, hContext))
{
DEBUG_WARN("invalid handle %p [%p]", hCard, hContext);
return SCARD_E_INVALID_TARGET;
}
ret.pbAttr = NULL; ret.pbAttr = NULL;
cbAttrLen = (call.cbAttrLen == 0) ? 0 : SCARD_AUTOALLOCATE; cbAttrLen = (call.cbAttrLen == 0) ? 0 : SCARD_AUTOALLOCATE;
status = SCardGetAttrib(hCard, call.dwAttrId, (cbAttrLen == 0) ? NULL : (BYTE*) &ret.pbAttr, &cbAttrLen); status = SCardGetAttrib(hCard, call.dwAttrId, (cbAttrLen == 0) ? NULL : (BYTE*) &ret.pbAttr, &cbAttrLen);
@ -1754,7 +1612,7 @@ static UINT32 handle_LocateCardsByATR(SMARTCARD_DEVICE* smartcard, IRP* irp, BOO
Stream_Read_UINT32(irp->input, hContext); Stream_Read_UINT32(irp->input, hContext);
Stream_Read_UINT32(irp->input, atrMaskCount); Stream_Read_UINT32(irp->input, atrMaskCount);
pAtrMasks = calloc(atrMaskCount, sizeof(SCARD_ATRMASK)); pAtrMasks = (SCARD_ATRMASK*) calloc(atrMaskCount, sizeof(SCARD_ATRMASK));
if (!pAtrMasks) if (!pAtrMasks)
return smartcard_output_return(irp, SCARD_E_NO_MEMORY); return smartcard_output_return(irp, SCARD_E_NO_MEMORY);
@ -1768,7 +1626,7 @@ static UINT32 handle_LocateCardsByATR(SMARTCARD_DEVICE* smartcard, IRP* irp, BOO
Stream_Read_UINT32(irp->input, readerCount); Stream_Read_UINT32(irp->input, readerCount);
readerStates = calloc(readerCount, sizeof(SCARD_READERSTATE)); readerStates = (SCARD_READERSTATEA*) calloc(readerCount, sizeof(SCARD_READERSTATEA));
for (i = 0; i < readerCount; i++) for (i = 0; i < readerCount; i++)
{ {
@ -1919,9 +1777,19 @@ void smartcard_irp_device_control(SMARTCARD_DEVICE* smartcard, IRP* irp)
return; return;
} }
WLog_Print(smartcard->log, WLOG_WARN, "ioControlCode: %s (0x%08X) FileId: %d CompletionId: %d", WLog_Print(smartcard->log, WLOG_DEBUG, "IoControlCode: %s (0x%08X) FileId: %d CompletionId: %d",
smartcard_get_ioctl_string(ioControlCode), ioControlCode, irp->FileId, irp->CompletionId); smartcard_get_ioctl_string(ioControlCode), ioControlCode, irp->FileId, irp->CompletionId);
#if 1
if ((ioControlCode != SCARD_IOCTL_TRANSMIT) &&
(ioControlCode != SCARD_IOCTL_GETSTATUSCHANGEA) &&
(ioControlCode != SCARD_IOCTL_GETSTATUSCHANGEW))
{
printf("IoControlCode: %s (0x%08X) FileId: %d CompletionId: %d\n",
smartcard_get_ioctl_string(ioControlCode), ioControlCode, irp->FileId, irp->CompletionId);
}
#endif
if ((ioControlCode != SCARD_IOCTL_ACCESSSTARTEDEVENT) && if ((ioControlCode != SCARD_IOCTL_ACCESSSTARTEDEVENT) &&
(ioControlCode != SCARD_IOCTL_RELEASESTARTEDEVENT)) (ioControlCode != SCARD_IOCTL_RELEASESTARTEDEVENT))
{ {