@@ -736,6 +736,17 @@ static CK_RV SetAttributeValue(WP11_Session* session, WP11_Object* obj,
736736 if ((getVar == CK_TRUE ) && (* (CK_BBOOL * )attr -> pValue == CK_FALSE ))
737737 return CKR_ATTRIBUTE_READ_ONLY ;
738738 }
739+ /* Cannot change extractable from false to true */
740+ if (!newObject && attr -> type == CKA_EXTRACTABLE ) {
741+ getVarLen = sizeof (getVar );
742+ rv = WP11_Object_GetAttr (obj , CKA_EXTRACTABLE , & getVar ,
743+ & getVarLen );
744+ if (rv != CKR_OK )
745+ return rv ;
746+
747+ if ((getVar == CK_FALSE ) && (* (CK_BBOOL * )attr -> pValue == CK_TRUE ))
748+ return CKR_ATTRIBUTE_READ_ONLY ;
749+ }
739750 ret = WP11_Object_SetAttr (obj , attr -> type , (byte * )attr -> pValue ,
740751 attr -> ulValueLen );
741752 if (ret == MEMORY_E )
@@ -779,15 +790,21 @@ static CK_RV NewObject(WP11_Session* session, CK_KEY_TYPE keyType,
779790 return CKR_FUNCTION_FAILED ;
780791
781792 ret = WP11_Object_SetClass (obj , keyClass );
782- if (ret != 0 )
793+ if (ret != 0 ) {
794+ WP11_Object_Free (obj );
783795 return CKR_FUNCTION_FAILED ;
796+ }
784797
785798 /* Now that object class is set, allocate type-specific data */
786799 ret = wp11_Object_AllocateTypeData (obj );
787- if (ret == MEMORY_E )
800+ if (ret == MEMORY_E ) {
801+ WP11_Object_Free (obj );
788802 return CKR_DEVICE_MEMORY ;
789- if (ret != 0 )
803+ }
804+ if (ret != 0 ) {
805+ WP11_Object_Free (obj );
790806 return CKR_FUNCTION_FAILED ;
807+ }
791808
792809 rv = SetAttributeValue (session , obj , pTemplate , ulCount , CK_TRUE );
793810 if (rv != CKR_OK ) {
@@ -1238,15 +1255,21 @@ CK_RV C_CopyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
12381255
12391256 /* Set the object class from the original object */
12401257 ret = WP11_Object_SetClass (newObj , WP11_Object_GetClass (obj ));
1241- if (ret != 0 )
1258+ if (ret != 0 ) {
1259+ WP11_Object_Free (newObj );
12421260 return CKR_FUNCTION_FAILED ;
1261+ }
12431262
12441263 /* Now that object class is set, allocate type-specific data */
12451264 ret = wp11_Object_AllocateTypeData (newObj );
1246- if (ret == MEMORY_E )
1265+ if (ret == MEMORY_E ) {
1266+ WP11_Object_Free (newObj );
12471267 return CKR_DEVICE_MEMORY ;
1248- if (ret != 0 )
1268+ }
1269+ if (ret != 0 ) {
1270+ WP11_Object_Free (newObj );
12491271 return CKR_FUNCTION_FAILED ;
1272+ }
12501273
12511274 /* copy all the attributes from the original object to the new object */
12521275 rv = WP11_Object_Copy (obj , newObj );
@@ -1605,7 +1628,7 @@ CK_RV C_FindObjectsInit(CK_SESSION_HANDLE hSession,
16051628 WOLFPKCS11_LEAVE ("C_FindObjectsInit" , rv );
16061629 return rv ;
16071630 }
1608- if (pTemplate == NULL ) {
1631+ if (pTemplate == NULL && ulCount != 0 ) {
16091632 rv = CKR_ARGUMENTS_BAD ;
16101633 WOLFPKCS11_LEAVE ("C_FindObjectsInit" , rv );
16111634 return rv ;
@@ -7563,15 +7586,22 @@ static int SetKeyExtract(WP11_Session* session, byte* ptr, CK_ULONG length,
75637586 secretKeyData [1 ] = ptr + (length - symmKeyLen );
75647587 secretKeyLen [1 ] = symmKeyLen ;
75657588 ret = WP11_Object_SetSecretKey (secret , secretKeyData , secretKeyLen );
7566- if (ret != CKR_OK )
7589+ if (ret != CKR_OK ) {
7590+ WP11_Object_Free (secret );
75677591 return CKR_FUNCTION_FAILED ;
7592+ }
75687593 ret = (int )AddObject (session , secret , pTemplate , ulAttributeCount ,
75697594 handle );
75707595 if (ret != CKR_OK ) {
7596+ WP11_Object_Free (secret );
75717597 return ret ;
75727598 }
75737599 }
7574- if ((ret == 0 ) && (isMac )) {
7600+ else {
7601+ WP11_Object_Free (secret );
7602+ return ret ;
7603+ }
7604+ if (isMac ) {
75757605 ret = WP11_Object_SetAttr (secret , CKA_KEY_TYPE , (byte * )& keyType ,
75767606 sizeof (keyType ));
75777607 if (ret != CKR_OK )
@@ -8004,8 +8034,10 @@ CK_RV C_DeriveKey(CK_SESSION_HANDLE hSession,
80048034 secretKeyLen [1 ] = symmKeyLen ;
80058035 ret = WP11_Object_SetSecretKey (obj , secretKeyData ,
80068036 secretKeyLen );
8007- if (ret != 0 )
8037+ if (ret != 0 ) {
8038+ WP11_Object_Free (obj );
80088039 rv = CKR_FUNCTION_FAILED ;
8040+ }
80098041 if (ret == 0 ) {
80108042 rv = AddObject (session , obj , pTemplate ,
80118043 ulAttributeCount , phKey );
0 commit comments