5757 } \
5858 while (0)
5959
60+ #define MAX_ATR_SIZE 33
61+ #define MAX_READERS 32
62+
6063extern int g_display_num ; /* in chansrv.c */
6164
6265static 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*/
13991412int
14001413scard_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