Skip to content

Commit 2fe0a4e

Browse files
committed
Fix issues with recent version of pcsc (1.8.8)
1 parent 693016a commit 2fe0a4e

File tree

1 file changed

+50
-14
lines changed

1 file changed

+50
-14
lines changed

sesman/chansrv/smartcard_pcsc.c

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@
5757
} \
5858
while (0)
5959

60+
#define MAX_ATR_SIZE 33
61+
#define MAX_READERS 32
62+
6063
extern int g_display_num; /* in chansrv.c */
6164

6265
static int g_autoinc = 0; /* general purpose autoinc */
@@ -74,7 +77,7 @@ typedef struct pubReaderStatesList
7477
tui32 eventCounter;
7578
tui32 readerState;
7679
tui32 readerSharing;
77-
tui8 cardAtr[36];
80+
tui8 cardAtr[MAX_ATR_SIZE];
7881
tui32 cardAtrLength;
7982
tui32 cardProtocol;
8083
} PCSC_READER_STATE;
@@ -100,11 +103,9 @@ struct pcsc_uds_client
100103
int state;
101104
int pad1;
102105

103-
/* should be 2944 bytes */
104-
/* 128 + 4 + 4 + 4 + 36 + 4 + 4 = 186, 186 * 16 = 2944 */
105-
PCSC_READER_STATE readerStates[16];
106-
tui32 current_states[16];
107-
tui32 event_states[16];
106+
PCSC_READER_STATE readerStates[MAX_READERS];
107+
tui32 current_states[MAX_READERS];
108+
tui32 event_states[MAX_READERS];
108109
int numReaders;
109110
int waiting;
110111
int something_changed;
@@ -750,15 +751,15 @@ scard_readers_to_list(struct pcsc_uds_client *uds_client,
750751
uds_client->readerStates[reader_index].eventCounter = 0;
751752
uds_client->readerStates[reader_index].readerState = 0;
752753
uds_client->readerStates[reader_index].readerSharing = 0;
753-
g_memset(uds_client->readerStates[reader_index].cardAtr, 0, 36);
754+
g_memset(uds_client->readerStates[reader_index].cardAtr, 0, MAX_ATR_SIZE);
754755
uds_client->readerStates[reader_index].cardAtrLength = 0;
755756
uds_client->readerStates[reader_index].cardProtocol = 0;
756757
uds_client->current_states[reader_index] = 0;
757758
uds_client->event_states[reader_index] = 0;
758759
}
759760
reader_index++;
760761
hold_reader = uds_client->readerStates[reader_index];
761-
if (reader_index > 15)
762+
if (reader_index > (MAX_READERS - 1))
762763
{
763764
return 0;
764765
}
@@ -773,7 +774,7 @@ scard_readers_to_list(struct pcsc_uds_client *uds_client,
773774
}
774775
uds_client->numReaders = reader_index;
775776
/* clear the rest */
776-
while (reader_index < 16)
777+
while (reader_index < MAX_READERS)
777778
{
778779
g_memset(uds_client->readerStates + reader_index, 0, sizeof(PCSC_READER_STATE));
779780
uds_client->current_states[reader_index] = 0;
@@ -1395,11 +1396,46 @@ scard_function_transmit_return(void *user_data,
13951396
}
13961397

13971398
/*****************************************************************************/
1398-
/* returns error */
1399+
struct pcsc_control_struct
1400+
{
1401+
int hCard;
1402+
tui32 dwControlCode;
1403+
tui32 cbSendLength;
1404+
tui32 cbRecvLength;
1405+
tui32 dwBytesReturned;
1406+
tui32 rv;
1407+
};
1408+
1409+
#define SCARD_E_UNSUPPORTED_FEATURE 0x8010001F
1410+
/*****************************************************************************/
1411+
/* process but return not supported*/
13991412
int
14001413
scard_process_control(struct trans *con, struct stream *in_s)
14011414
{
1402-
return 0;
1415+
struct pcsc_control_struct pcscCtl;
1416+
char* sentBuffer;
1417+
int rv;
1418+
struct stream *out_s;
1419+
1420+
LLOGLN(10, ("scard_process_control:"));
1421+
rv = 0;
1422+
in_uint8a(in_s, &pcscCtl, sizeof(pcscCtl));
1423+
sentBuffer = g_new0(char, pcscCtl.cbSendLength);
1424+
in_uint8a(in_s, sentBuffer, pcscCtl.cbSendLength);
1425+
1426+
pcscCtl.cbRecvLength = pcscCtl.cbSendLength;
1427+
pcscCtl.dwBytesReturned = 0;
1428+
pcscCtl.rv = SCARD_E_UNSUPPORTED_FEATURE;
1429+
1430+
LLOGLN(10, ("scard_process_control: return SCARD_E_UNSUPPORTED_FEATURE"));
1431+
out_s = con->out_s;
1432+
init_stream(out_s, 0);
1433+
out_uint8a(out_s, &pcscCtl, sizeof(pcscCtl));
1434+
s_mark_end(out_s);
1435+
rv = trans_write_copy(con);
1436+
1437+
g_free(sentBuffer);
1438+
return rv;
14031439
}
14041440

14051441
/*****************************************************************************/
@@ -1454,7 +1490,7 @@ scard_process_status(struct trans *con, struct stream *in_s)
14541490
scard_send_status(pcscStatus, 0,
14551491
lcontext->context, lcontext->context_bytes,
14561492
lcard->card, lcard->card_bytes,
1457-
128, 36, 0);
1493+
128, MAX_ATR_SIZE, 0);
14581494
}
14591495
else
14601496
{
@@ -1503,7 +1539,7 @@ scard_function_status_return(void *user_data,
15031539
int dwProtocol;
15041540
int dwAtrLen;
15051541
int return_code;
1506-
char attr[36];
1542+
char attr[MAX_ATR_SIZE];
15071543
char reader_name[128];
15081544
int rv;
15091545
struct stream *out_s;
@@ -1762,7 +1798,7 @@ scard_function_get_status_change_return(void *user_data,
17621798
uds_client->send_status = 1;
17631799
}
17641800
in_uint32_le(in_s, uds_client->readerStates[index].cardAtrLength);
1765-
in_uint8a(in_s, uds_client->readerStates[index].cardAtr, 36);
1801+
in_uint8a(in_s, uds_client->readerStates[index].cardAtr, MAX_ATR_SIZE);
17661802
uds_client->readerStates[index].eventCounter = (event_state >> 16) & 0xFFFF;
17671803
}
17681804
}

0 commit comments

Comments
 (0)