when i verify a lot of same xml, task manager show me that memory grows (leaks). My code looks :
int verify_xml(const char* xml, int xmlLen, const char *signedNodeName) {
xmlDocPtr doc = NULL;
xmlNodePtr node = NULL;
xmlSecDSigCtxPtr dsigCtx = NULL;
xmlNodePtr keyInfo, x509Data, x509Certificate = NULL;
xmlChar *certEncode;
tByte *certBin;
int certBinLen;xmlSecKeysMngrPtr keyMngr; HCERTSTORE hKeyStore;
if((xml == NULL) || (xmlLen < 1)) {
return -1;
} /* load doc from memory */
doc = xmlParseMemory(xml, xmlLen);
if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL)){
if(doc != NULL) {
xmlFreeDoc(doc);
}
return -2;
} /* find signed node */
node = zrcXmlFindNode(xmlDocGetRootElement(doc), signedNodeName);
if(node == NULL) {
xmlFreeDoc(doc);
return -2;
}xmlSecAddIDs(doc, node, xmlSecEncIds);
/* find start node */
node = zrcXmlFindNode(xmlDocGetRootElement(doc), xmlSecNodeSignature);
if(node == NULL) {
xmlFreeDoc(doc);
return -3;
}
keyInfo = zrcXmlFindNode(node, xmlSecNodeKeyInfo);
if(keyInfo == NULL) {
xmlFreeDoc(doc);
return -4;
} x509Data = zrcXmlFindNode(keyInfo, xmlSecNodeX509Data);
if(x509Data == NULL) {
xmlFreeDoc(doc);
return -5;
} x509Certificate = zrcXmlFindNode(x509Data, xmlSecNodeX509Certificate);
if(x509Certificate == NULL) {
xmlFreeDoc(doc);
return -6;
}/* create the key mngr */ keyMngr = xmlSecKeysMngrCreate() ;
certEncode = xmlNodeListGetString(doc, x509Certificate->xmlChildrenNode, 0);
if(certEncode == NULL) {
xmlFreeDoc(doc);
return -77;
}
certBinLen = B64_Decode(certEncode, &certBin);
if(certBinLen <= 0) {
xmlFree(certEncode);
xmlFreeDoc(doc);
return -8;
}
xmlFree(certEncode);hKeyStore = CertOpenStore( CERT_STORE_PROV_MEMORY, // The memory provider type
0, // The encoding type is not needed
0, // Use the default HCRYPTPROV
0, // Accept the default dwFlags
NULL // pvPara is not used
);
//add certificate
CertAddEncodedCertificateToStore(hKeyStore, PKCS_7_ASN_ENCODING || X509_ASN_ENCODING, certBin, certBinLen, CERT_STORE_ADD_ALWAYS, NULL);
/* add cert store to the mngr */ xmlSecMSCryptoAppDefaultKeysMngrAdoptTrustedStore(keyMngr, hKeyStore);
/* create signature context, we don't need keys manager in this example */
dsigCtx = xmlSecDSigCtxCreate(keyMngr);
if(dsigCtx == NULL) {
xmlFreeDoc(doc);
xmlSecKeysMngrDestroy(keyMngr);
CertCloseStore(hKeyStore, 0);
return -7;
}
/* load public key */
dsigCtx->signKey = xmlSecCryptoAppKeyLoadMemory(certBin, certBinLen, xmlSecKeyDataFormatCertDer, NULL, NULL, NULL);
if(dsigCtx->signKey == NULL) {
free(certBin);
xmlSecDSigCtxDestroy(dsigCtx);
xmlFreeDoc(doc);
xmlSecKeysMngrDestroy(keyMngr);
CertCloseStore(hKeyStore, 0);
return -9;
}
free(certBin);
/* Verify signature */
if(xmlSecDSigCtxVerify(dsigCtx, node) < 0) {
xmlSecDSigCtxDestroy(dsigCtx);
xmlFreeDoc(doc);
xmlSecKeysMngrDestroy(keyMngr);
CertCloseStore(hKeyStore, 0);
return -10; }
/* print verification result to stdout */
if(dsigCtx->status == xmlSecDSigStatusSucceeded) {
xmlSecDSigCtxDestroy(dsigCtx);
xmlFreeDoc(doc);
xmlSecKeysMngrDestroy(keyMngr);
CertCloseStore(hKeyStore, 0);
return 0;
} else {
xmlSecDSigCtxDestroy(dsigCtx);
xmlFreeDoc(doc);
xmlSecKeysMngrDestroy(keyMngr);
CertCloseStore(hKeyStore, 0);
return -11;
} }
Program: Init() SignXml(...) while(1) { verify_xml(..) } Done()
Any suggestions, thanks in advance Luka Por _______________________________________________ xmlsec mailing list [email protected] http://www.aleksey.com/mailman/listinfo/xmlsec
