[Pcsclite-cvs-commit] CVS PCSC/src

CVS User rousseau ludovic.rousseau@free.fr
Wed, 01 Sep 2004 02:11:34 -0600


Update of /cvsroot/pcsclite/PCSC/src
In directory haydn:/tmp/cvs-serv12572

Modified Files:
	winscard_clnt.c 
Log Message:
add support of SCardGetAttrib() with a NULL pbAttr parameter to only get
the needed lenth in pcbAttrLen


--- /cvsroot/pcsclite/PCSC/src/winscard_clnt.c	2004/08/24 14:02:36	1.43
+++ /cvsroot/pcsclite/PCSC/src/winscard_clnt.c	2004/09/01 08:11:33	1.44
@@ -9,7 +9,7 @@
  *  Damien Sauveron <damien.sauveron@labri.fr>
  *  Ludovic Rousseau <ludovic.rousseau@free.fr>
  *
- * $Id: winscard_clnt.c,v 1.43 2004/08/24 14:02:36 rousseau Exp $
+ * $Id: winscard_clnt.c,v 1.44 2004/09/01 08:11:33 rousseau Exp $
  */
 
 #include "config.h"
@@ -1564,6 +1564,14 @@
 LONG SCardGetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPBYTE pbAttr,
 	LPDWORD pcbAttrLen)
 {
+	if (NULL == pcbAttrLen)
+		return SCARD_E_INVALID_PARAMETER;
+
+	/* if only get the length */
+	if (NULL == pbAttr)
+		/* this variable may not be set by the caller. use a reasonable size */
+		*pcbAttrLen = MAX_BUFFER_SIZE;
+
 	return SCardGetSetAttrib(hCard, SCARD_GET_ATTRIB, dwAttrId, pbAttr,
 		pcbAttrLen);
 }
@@ -1571,6 +1579,9 @@
 LONG SCardSetAttrib(SCARDHANDLE hCard, DWORD dwAttrId, LPCBYTE pbAttr,
 	DWORD cbAttrLen)
 {
+	if (NULL == pbAttr || 0 == cbAttrLen)
+		return SCARD_E_INVALID_PARAMETER;
+
 	return SCardGetSetAttrib(hCard, SCARD_SET_ATTRIB, dwAttrId, (LPBYTE)pbAttr,
 		&cbAttrLen);
 }
@@ -1584,9 +1595,6 @@
 	int i;
 	DWORD dwContextIndex, dwChannelIndex;
 
-	if (NULL == pbAttr || 0 == *pcbAttrLen)
-		return SCARD_E_INVALID_PARAMETER;
-
 	if (SCardCheckDaemonAvailability() != SCARD_S_SUCCESS)
 		return SCARD_E_NO_SERVICE;
 
@@ -1625,7 +1633,8 @@
 	scGetSetStruct.dwAttrId = dwAttrId;
 	scGetSetStruct.cbAttrLen = *pcbAttrLen;
 	scGetSetStruct.rv = SCARD_E_NO_SERVICE;
-	memcpy(scGetSetStruct.pbAttr, pbAttr, *pcbAttrLen);
+	if (SCARD_SET_ATTRIB == command)
+		memcpy(scGetSetStruct.pbAttr, pbAttr, *pcbAttrLen);
 
 	rv = WrapSHMWrite(command,
 		psContextMap[dwContextIndex].dwClientID, sizeof(scGetSetStruct),
@@ -1663,7 +1672,9 @@
 		else
 			*pcbAttrLen = scGetSetStruct.cbAttrLen;
 
-		memcpy(pbAttr, scGetSetStruct.pbAttr, scGetSetStruct.cbAttrLen);
+		if (pbAttr)
+			memcpy(pbAttr, scGetSetStruct.pbAttr, scGetSetStruct.cbAttrLen);
+
 		memset(scGetSetStruct.pbAttr, 0x00, sizeof(scGetSetStruct.pbAttr));
 	}