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