Hello Ludovic,

On Sat, May 26, 2012 at 5:40 PM, Ludovic Rousseau
<[email protected]> wrote:
> Can you use the SVN version of the driver or use the snapshort version
> at [1] and try your stress test again?

Thanks it works. No pattern "C" currently, but
now the stresstest shows, that the segfaults happen more often.

I have attached a demonstration program.
In one shell the binary is run, in the other the
the script which automate the disconnect/reconnect of the
USB bus.
(Here I have an "uptime" of ~20secs until pcscd segfaults.)

I think this is not so easy to fix.

regards,

Martin
#include <stdio.h>
#include <unistd.h>
#include <PCSC/pcsclite.h>
#include <PCSC/winscard.h>


/**
   compile with:
   gcc -o disconnect -I/usr/include/PCSC/ disconnect.cpp -lpcsclite

   In another shell run disconnect.sh:

   #!/bin/sh
   # 2-1.3 was discovered by removing and inserting the token
   # followed by dmesg
   USBLIST="2-1.3"

   while true ; do
      for USB in $USBLIST ; do 
        echo -n $USB >/sys/bus/usb/drivers/usb/unbind
      done    
      sleep 1
      for USB in $USBLIST ; do   
        echo -n $USB >/sys/bus/usb/drivers/usb/bind
      done  
      sleep 1
   done


 */

#define FREERDP_HEXDUMP_LINE_LENGTH 16

int ms_len(char* data) {
	char* p=data;
	int len=0;
	while ( (p[0] != 0) && (p[1] != 0) ) {
		len++;
		p++;
	}
	return len;
}

void sc_hexdump_ms(char* data,int length){
	char* p = data;
	int i, line, offset = 0;

	while ( offset < length ) {
	
		printf("%04x ", offset);

		line = length - offset;

		if (line > FREERDP_HEXDUMP_LINE_LENGTH)
			line = FREERDP_HEXDUMP_LINE_LENGTH;

		for (i = 0; i < line; i++)
			printf("%02x ", p[i]);

		for (; i < FREERDP_HEXDUMP_LINE_LENGTH; i++)
			printf("   ");

		for (i = 0; i < line; i++)
			printf("%c", (p[i] >= 0x20 && p[i] < 0x7F) ? p[i] : '.');

		printf("\n");

		offset += line;
		p += line;
	}
}

void inner_loop(SCARDCONTEXT hContext,char* mszReaders) {
	SCARDHANDLE hCard;
        DWORD dwActiveProtocol;
	int ret;
	while(1) {
		ret=SCardConnect(hContext,mszReaders,SCARD_SHARE_SHARED,
				 SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1,
				 &hCard,&dwActiveProtocol);
		printf("SCardConnect:0x%x\n",ret);
		if (ret != SCARD_S_SUCCESS) {
			printf("failed Scardconnect\n");
			sleep(1);
			return;
		}
		//sleep(1);
		ret=SCardDisconnect(hCard,SCARD_UNPOWER_CARD);
		printf("SCardDisconnect:0x%x\n",ret);
		if (ret != SCARD_S_SUCCESS) {
			printf("failed Scarddisconnect\n");
			sleep(1);
			
		}
	}
}

int main(int argc, char* argv[])
{
        int ret;
        SCARDCONTEXT hContext;
        char* mszReaders;
        DWORD pcchReaders=SCARD_AUTOALLOCATE;
        SCARDHANDLE hCard;
        DWORD dwActiveProtocol;
        DWORD dwControlCode;
        char* pbRecvBuffer;
        int cbRecvLength=1024;
	int len=0;
        DWORD lpBytesReturned;
	while(1) {
		ret=SCardEstablishContext(SCARD_SCOPE_SYSTEM,NULL,NULL,
					  &hContext);
		printf("SCardEstablishContext: 0x%x\n",ret);
		if (ret != SCARD_S_SUCCESS) {
			printf("Scardestabilcontext failed-retry\n");
			sleep(1);
			continue;
		}
		pcchReaders=SCARD_AUTOALLOCATE;
		ret=SCardListReaders(hContext, NULL,
				     (char*)&mszReaders, &pcchReaders);
		if (ret != SCARD_S_SUCCESS) {
			printf("ListReaders failed\n");
			SCardReleaseContext(hContext);
			sleep(1);
			continue;
		}
		printf("SCardListReaders:0x%x pcchReaders:0x%x\n",ret,
		       pcchReaders);
		//len=ms_len(mszReaders);
		//sc_hexdump_ms(mszReaders,pcchReaders);
		//const char* szReaders="Aladdin Token JC 0";
		inner_loop(hContext,mszReaders);
		printf("rerun...\n");
		SCardFreeMemory(hContext,mszReaders);
		SCardReleaseContext(hContext);
	}
	
	
        return 0;
	
	
}

_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle

Reply via email to