Index: mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.c |
=================================================================== |
--- mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.c (revision 191424) |
+++ mozilla/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_aiamgr.c (working copy) |
@@ -1,674 +0,0 @@ |
-/* This Source Code Form is subject to the terms of the Mozilla Public |
- * License, v. 2.0. If a copy of the MPL was not distributed with this |
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
-/* |
- * pkix_pl_aiamgr.c |
- * |
- * AIAMgr Object Definitions |
- * |
- */ |
- |
-#include "pkix_pl_aiamgr.h" |
-extern PKIX_PL_HashTable *aiaConnectionCache; |
- |
-/* --Virtual-LdapClient-Functions------------------------------------ */ |
- |
-PKIX_Error * |
-PKIX_PL_LdapClient_InitiateRequest( |
- PKIX_PL_LdapClient *client, |
- LDAPRequestParams *requestParams, |
- void **pNBIO, |
- PKIX_List **pResponse, |
- void *plContext) |
-{ |
- PKIX_ENTER(LDAPCLIENT, "PKIX_PL_LdapClient_InitiateRequest"); |
- PKIX_NULLCHECK_TWO(client, client->initiateFcn); |
- |
- PKIX_CHECK(client->initiateFcn |
- (client, requestParams, pNBIO, pResponse, plContext), |
- PKIX_LDAPCLIENTINITIATEREQUESTFAILED); |
-cleanup: |
- |
- PKIX_RETURN(LDAPCLIENT); |
- |
-} |
- |
-PKIX_Error * |
-PKIX_PL_LdapClient_ResumeRequest( |
- PKIX_PL_LdapClient *client, |
- void **pNBIO, |
- PKIX_List **pResponse, |
- void *plContext) |
-{ |
- PKIX_ENTER(LDAPCLIENT, "PKIX_PL_LdapClient_ResumeRequest"); |
- PKIX_NULLCHECK_TWO(client, client->resumeFcn); |
- |
- PKIX_CHECK(client->resumeFcn |
- (client, pNBIO, pResponse, plContext), |
- PKIX_LDAPCLIENTRESUMEREQUESTFAILED); |
-cleanup: |
- |
- PKIX_RETURN(LDAPCLIENT); |
- |
-} |
- |
-/* --Private-AIAMgr-Functions----------------------------------*/ |
- |
-/* |
- * FUNCTION: pkix_pl_AIAMgr_Destroy |
- * (see comments for PKIX_PL_DestructorCallback in pkix_pl_pki.h) |
- */ |
-static PKIX_Error * |
-pkix_pl_AIAMgr_Destroy( |
- PKIX_PL_Object *object, |
- void *plContext) |
-{ |
- PKIX_PL_AIAMgr *aiaMgr = NULL; |
- |
- PKIX_ENTER(AIAMGR, "pkix_pl_AIAMgr_Destroy"); |
- PKIX_NULLCHECK_ONE(object); |
- |
- PKIX_CHECK(pkix_CheckType(object, PKIX_AIAMGR_TYPE, plContext), |
- PKIX_OBJECTNOTAIAMGR); |
- |
- aiaMgr = (PKIX_PL_AIAMgr *)object; |
- |
- /* pointer to cert cache */ |
- /* pointer to crl cache */ |
- aiaMgr->method = 0; |
- aiaMgr->aiaIndex = 0; |
- aiaMgr->numAias = 0; |
- PKIX_DECREF(aiaMgr->aia); |
- PKIX_DECREF(aiaMgr->location); |
- PKIX_DECREF(aiaMgr->results); |
- PKIX_DECREF(aiaMgr->client.ldapClient); |
- |
-cleanup: |
- |
- PKIX_RETURN(AIAMGR); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_AIAMgr_RegisterSelf |
- * DESCRIPTION: |
- * Registers PKIX_AIAMGR_TYPE and its related functions with systemClasses[] |
- * THREAD SAFETY: |
- * Not Thread Safe - for performance and complexity reasons |
- * |
- * Since this function is only called by PKIX_PL_Initialize, which should |
- * only be called once, it is acceptable that this function is not |
- * thread-safe. |
- */ |
-PKIX_Error * |
-pkix_pl_AIAMgr_RegisterSelf(void *plContext) |
-{ |
- extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES]; |
- pkix_ClassTable_Entry *entry = &systemClasses[PKIX_AIAMGR_TYPE]; |
- |
- PKIX_ENTER(AIAMGR, "pkix_pl_AIAMgr_RegisterSelf"); |
- |
- entry->description = "AIAMgr"; |
- entry->typeObjectSize = sizeof(PKIX_PL_AIAMgr); |
- entry->destructor = pkix_pl_AIAMgr_Destroy; |
- |
- PKIX_RETURN(AIAMGR); |
-} |
- |
-/* |
- * FUNCTION: pkix_pl_AiaMgr_FindLDAPClient |
- * DESCRIPTION: |
- * |
- * This function checks the collection of LDAPClient connections held by the |
- * AIAMgr pointed to by "aiaMgr" for one matching the domain name given by |
- * "domainName". The string may include a port number: e.g., "betty.nist.gov" |
- * or "nss.red.iplanet.com:1389". If a match is found, that LDAPClient is |
- * stored at "pClient". Otherwise, an LDAPClient is created and added to the |
- * collection, and then stored at "pClient". |
- * |
- * PARAMETERS: |
- * "aiaMgr" |
- * The AIAMgr whose LDAPClient connected are to be managed. Must be |
- * non-NULL. |
- * "domainName" |
- * Address of a string pointing to a server name. Must be non-NULL. |
- * "pClient" |
- * Address at which the returned LDAPClient is stored. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns an AIAMgr Error if the function fails in a non-fatal way |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-static PKIX_Error * |
-pkix_pl_AiaMgr_FindLDAPClient( |
- PKIX_PL_AIAMgr *aiaMgr, |
- char *domainName, |
- PKIX_PL_LdapClient **pClient, |
- void *plContext) |
-{ |
- PKIX_PL_String *domainString = NULL; |
- PKIX_PL_LdapDefaultClient *client = NULL; |
- |
- PKIX_ENTER(AIAMGR, "pkix_pl_AiaMgr_FindLDAPClient"); |
- PKIX_NULLCHECK_THREE(aiaMgr, domainName, pClient); |
- |
- /* create PKIX_PL_String from domain name */ |
- PKIX_CHECK(PKIX_PL_String_Create |
- (PKIX_ESCASCII, domainName, 0, &domainString, plContext), |
- PKIX_STRINGCREATEFAILED); |
- |
- /* Is this domainName already in cache? */ |
- PKIX_CHECK(PKIX_PL_HashTable_Lookup |
- (aiaConnectionCache, |
- (PKIX_PL_Object *)domainString, |
- (PKIX_PL_Object **)&client, |
- plContext), |
- PKIX_HASHTABLELOOKUPFAILED); |
- |
- if (client == NULL) { |
- |
- /* No, create a connection (and cache it) */ |
- PKIX_CHECK(PKIX_PL_LdapDefaultClient_CreateByName |
- (domainName, |
- /* Do not use NBIO until we verify, that |
- * it is working. For now use 1 min timeout. */ |
- PR_SecondsToInterval( |
- ((PKIX_PL_NssContext*)plContext)->timeoutSeconds), |
- NULL, |
- &client, |
- plContext), |
- PKIX_LDAPDEFAULTCLIENTCREATEBYNAMEFAILED); |
- |
- PKIX_CHECK(PKIX_PL_HashTable_Add |
- (aiaConnectionCache, |
- (PKIX_PL_Object *)domainString, |
- (PKIX_PL_Object *)client, |
- plContext), |
- PKIX_HASHTABLEADDFAILED); |
- |
- } |
- |
- *pClient = (PKIX_PL_LdapClient *)client; |
- |
-cleanup: |
- |
- PKIX_DECREF(domainString); |
- |
- PKIX_RETURN(AIAMGR); |
-} |
- |
-PKIX_Error * |
-pkix_pl_AIAMgr_GetHTTPCerts( |
- PKIX_PL_AIAMgr *aiaMgr, |
- PKIX_PL_InfoAccess *ia, |
- void **pNBIOContext, |
- PKIX_List **pCerts, |
- void *plContext) |
-{ |
- PKIX_PL_GeneralName *location = NULL; |
- PKIX_PL_String *locationString = NULL; |
- PKIX_UInt32 len = 0; |
- PRUint16 port = 0; |
- const SEC_HttpClientFcn *httpClient = NULL; |
- const SEC_HttpClientFcnV1 *hcv1 = NULL; |
- SECStatus rv = SECFailure; |
- SEC_HTTP_SERVER_SESSION serverSession = NULL; |
- SEC_HTTP_REQUEST_SESSION requestSession = NULL; |
- char *path = NULL; |
- char *hostname = NULL; |
- char *locationAscii = NULL; |
- void *nbio = NULL; |
- PRUint16 responseCode = 0; |
- const char *responseContentType = NULL; |
- const char *responseData = NULL; |
- |
- PKIX_ENTER(AIAMGR, "pkix_pl_AIAMgr_GetHTTPCerts"); |
- PKIX_NULLCHECK_FOUR(aiaMgr, ia, pNBIOContext, pCerts); |
- |
- nbio = *pNBIOContext; |
- *pNBIOContext = NULL; |
- *pCerts = NULL; |
- |
- if (nbio == NULL) { /* a new request */ |
- |
- PKIX_CHECK(PKIX_PL_InfoAccess_GetLocation |
- (ia, &location, plContext), |
- PKIX_INFOACCESSGETLOCATIONFAILED); |
- |
- /* find or create httpClient = default client */ |
- httpClient = SEC_GetRegisteredHttpClient(); |
- aiaMgr->client.hdata.httpClient = httpClient; |
- if (!httpClient) |
- PKIX_ERROR(PKIX_OUTOFMEMORY); |
- |
- if (httpClient->version == 1) { |
- |
- PKIX_UInt32 timeout = |
- ((PKIX_PL_NssContext*)plContext)->timeoutSeconds; |
- |
- hcv1 = &(httpClient->fcnTable.ftable1); |
- |
- /* create server session */ |
- PKIX_TOSTRING(location, &locationString, plContext, |
- PKIX_GENERALNAMETOSTRINGFAILED); |
- |
- PKIX_CHECK(PKIX_PL_String_GetEncoded |
- (locationString, |
- PKIX_ESCASCII, |
- (void **)&locationAscii, |
- &len, |
- plContext), |
- PKIX_STRINGGETENCODEDFAILED); |
- |
- rv = CERT_ParseURL(locationAscii, &hostname, &port, |
- &path); |
- if ((rv != SECSuccess) || |
- (hostname == NULL) || |
- (path == NULL)) { |
- PKIX_ERROR(PKIX_URLPARSINGFAILED); |
- } |
- |
- rv = (*hcv1->createSessionFcn)(hostname, port, |
- &serverSession); |
- if (rv != SECSuccess) { |
- PKIX_ERROR(PKIX_HTTPCLIENTCREATESESSIONFAILED); |
- } |
- |
- aiaMgr->client.hdata.serverSession = serverSession; |
- |
- /* create request session */ |
- rv = (*hcv1->createFcn)(serverSession, "http", path, |
- "GET", PR_SecondsToInterval(timeout), |
- &requestSession); |
- if (rv != SECSuccess) { |
- PKIX_ERROR(PKIX_HTTPSERVERERROR); |
- } |
- |
- aiaMgr->client.hdata.requestSession = requestSession; |
- } else { |
- PKIX_ERROR(PKIX_UNSUPPORTEDVERSIONOFHTTPCLIENT); |
- } |
- } |
- |
- httpClient = aiaMgr->client.hdata.httpClient; |
- |
- if (httpClient->version == 1) { |
- PRUint32 responseDataLen = |
- ((PKIX_PL_NssContext*)plContext)->maxResponseLength; |
- |
- hcv1 = &(httpClient->fcnTable.ftable1); |
- requestSession = aiaMgr->client.hdata.requestSession; |
- |
- /* trySendAndReceive */ |
- rv = (*hcv1->trySendAndReceiveFcn)(requestSession, |
- (PRPollDesc **)&nbio, |
- &responseCode, |
- (const char **)&responseContentType, |
- NULL, /* &responseHeaders */ |
- (const char **)&responseData, |
- &responseDataLen); |
- |
- if (rv != SECSuccess) { |
- PKIX_ERROR(PKIX_HTTPSERVERERROR); |
- } |
- |
- if (nbio != 0) { |
- *pNBIOContext = nbio; |
- goto cleanup; |
- } |
- |
- PKIX_CHECK(pkix_pl_HttpCertStore_ProcessCertResponse |
- (responseCode, |
- responseContentType, |
- responseData, |
- responseDataLen, |
- pCerts, |
- plContext), |
- PKIX_HTTPCERTSTOREPROCESSCERTRESPONSEFAILED); |
- |
- /* Session and request cleanup in case of success */ |
- if (aiaMgr->client.hdata.requestSession != NULL) { |
- (*hcv1->freeFcn)(aiaMgr->client.hdata.requestSession); |
- aiaMgr->client.hdata.requestSession = NULL; |
- } |
- if (aiaMgr->client.hdata.serverSession != NULL) { |
- (*hcv1->freeSessionFcn)(aiaMgr->client.hdata.serverSession); |
- aiaMgr->client.hdata.serverSession = NULL; |
- } |
- aiaMgr->client.hdata.httpClient = 0; /* callback fn */ |
- |
- } else { |
- PKIX_ERROR(PKIX_UNSUPPORTEDVERSIONOFHTTPCLIENT); |
- } |
- |
-cleanup: |
- /* Session and request cleanup in case of error. Passing through without cleanup |
- * if interrupted by blocked IO. */ |
- if (PKIX_ERROR_RECEIVED && aiaMgr) { |
- if (aiaMgr->client.hdata.requestSession != NULL) { |
- (*hcv1->freeFcn)(aiaMgr->client.hdata.requestSession); |
- aiaMgr->client.hdata.requestSession = NULL; |
- } |
- if (aiaMgr->client.hdata.serverSession != NULL) { |
- (*hcv1->freeSessionFcn)(aiaMgr->client.hdata.serverSession); |
- aiaMgr->client.hdata.serverSession = NULL; |
- } |
- aiaMgr->client.hdata.httpClient = 0; /* callback fn */ |
- } |
- |
- PKIX_DECREF(location); |
- PKIX_DECREF(locationString); |
- |
- if (locationAscii) { |
- PORT_Free(locationAscii); |
- } |
- if (hostname) { |
- PORT_Free(hostname); |
- } |
- if (path) { |
- PORT_Free(path); |
- } |
- |
- PKIX_RETURN(AIAMGR); |
-} |
- |
-PKIX_Error * |
-pkix_pl_AIAMgr_GetLDAPCerts( |
- PKIX_PL_AIAMgr *aiaMgr, |
- PKIX_PL_InfoAccess *ia, |
- void **pNBIOContext, |
- PKIX_List **pCerts, |
- void *plContext) |
-{ |
- PKIX_List *result = NULL; |
- PKIX_PL_GeneralName *location = NULL; |
- PKIX_PL_LdapClient *client = NULL; |
- LDAPRequestParams request; |
- PRArenaPool *arena = NULL; |
- char *domainName = NULL; |
- void *nbio = NULL; |
- |
- PKIX_ENTER(AIAMGR, "pkix_pl_AIAMgr_GetLDAPCerts"); |
- PKIX_NULLCHECK_FOUR(aiaMgr, ia, pNBIOContext, pCerts); |
- |
- nbio = *pNBIOContext; |
- *pNBIOContext = NULL; |
- *pCerts = NULL; |
- |
- if (nbio == NULL) { /* a new request */ |
- |
- /* Initiate an LDAP request */ |
- |
- request.scope = WHOLE_SUBTREE; |
- request.derefAliases = NEVER_DEREF; |
- request.sizeLimit = 0; |
- request.timeLimit = 0; |
- |
- PKIX_CHECK(PKIX_PL_InfoAccess_GetLocation |
- (ia, &location, plContext), |
- PKIX_INFOACCESSGETLOCATIONFAILED); |
- |
- /* |
- * Get a short-lived arena. We'll be done with |
- * this space once the request is encoded. |
- */ |
- arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); |
- if (!arena) { |
- PKIX_ERROR_FATAL(PKIX_OUTOFMEMORY); |
- } |
- |
- PKIX_CHECK(pkix_pl_InfoAccess_ParseLocation |
- (location, arena, &request, &domainName, plContext), |
- PKIX_INFOACCESSPARSELOCATIONFAILED); |
- |
- PKIX_DECREF(location); |
- |
- /* Find or create a connection to LDAP server */ |
- PKIX_CHECK(pkix_pl_AiaMgr_FindLDAPClient |
- (aiaMgr, domainName, &client, plContext), |
- PKIX_AIAMGRFINDLDAPCLIENTFAILED); |
- |
- aiaMgr->client.ldapClient = client; |
- |
- PKIX_CHECK(PKIX_PL_LdapClient_InitiateRequest |
- (aiaMgr->client.ldapClient, |
- &request, |
- &nbio, |
- &result, |
- plContext), |
- PKIX_LDAPCLIENTINITIATEREQUESTFAILED); |
- |
- PKIX_PL_NSSCALL(AIAMGR, PORT_FreeArena, (arena, PR_FALSE)); |
- |
- } else { |
- |
- PKIX_CHECK(PKIX_PL_LdapClient_ResumeRequest |
- (aiaMgr->client.ldapClient, &nbio, &result, plContext), |
- PKIX_LDAPCLIENTRESUMEREQUESTFAILED); |
- |
- } |
- |
- if (nbio != NULL) { /* WOULDBLOCK */ |
- *pNBIOContext = nbio; |
- *pCerts = NULL; |
- goto cleanup; |
- } |
- |
- PKIX_DECREF(aiaMgr->client.ldapClient); |
- |
- if (result == NULL) { |
- *pCerts = NULL; |
- } else { |
- PKIX_CHECK(pkix_pl_LdapCertStore_BuildCertList |
- (result, pCerts, plContext), |
- PKIX_LDAPCERTSTOREBUILDCERTLISTFAILED); |
- } |
- |
- *pNBIOContext = nbio; |
- |
-cleanup: |
- |
- if (arena && (PKIX_ERROR_RECEIVED)) { |
- PKIX_PL_NSSCALL(AIAMGR, PORT_FreeArena, (arena, PR_FALSE)); |
- } |
- |
- if (PKIX_ERROR_RECEIVED) { |
- PKIX_DECREF(aiaMgr->client.ldapClient); |
- } |
- |
- PKIX_DECREF(location); |
- |
- PKIX_RETURN(AIAMGR); |
-} |
- |
-/* |
- * FUNCTION: PKIX_PL_AIAMgr_Create |
- * DESCRIPTION: |
- * |
- * This function creates an AIAMgr, storing the result at "pAIAMgr". |
- * |
- * PARAMETERS: |
- * "pAIAMGR" |
- * Address at which the returned AIAMgr is stored. Must be non-NULL. |
- * "plContext" |
- * Platform-specific context pointer. |
- * THREAD SAFETY: |
- * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
- * RETURNS: |
- * Returns NULL if the function succeeds. |
- * Returns an AIAMgr Error if the function fails in a non-fatal way |
- * Returns a Fatal Error if the function fails in an unrecoverable way. |
- */ |
-PKIX_Error * |
-PKIX_PL_AIAMgr_Create( |
- PKIX_PL_AIAMgr **pAIAMgr, |
- void *plContext) |
-{ |
- PKIX_PL_AIAMgr *aiaMgr = NULL; |
- |
- PKIX_ENTER(AIAMGR, "PKIX_PL_AIAMgr_Create"); |
- PKIX_NULLCHECK_ONE(pAIAMgr); |
- |
- PKIX_CHECK(PKIX_PL_Object_Alloc |
- (PKIX_AIAMGR_TYPE, |
- sizeof(PKIX_PL_AIAMgr), |
- (PKIX_PL_Object **)&aiaMgr, |
- plContext), |
- PKIX_COULDNOTCREATEAIAMGROBJECT); |
- /* pointer to cert cache */ |
- /* pointer to crl cache */ |
- aiaMgr->method = 0; |
- aiaMgr->aiaIndex = 0; |
- aiaMgr->numAias = 0; |
- aiaMgr->aia = NULL; |
- aiaMgr->location = NULL; |
- aiaMgr->results = NULL; |
- aiaMgr->client.hdata.httpClient = NULL; |
- aiaMgr->client.hdata.serverSession = NULL; |
- aiaMgr->client.hdata.requestSession = NULL; |
- |
- *pAIAMgr = aiaMgr; |
- |
-cleanup: |
- |
- PKIX_RETURN(AIAMGR); |
-} |
- |
-/* --Public-Functions------------------------------------------------------- */ |
- |
-/* |
- * FUNCTION: PKIX_PL_AIAMgr_GetAIACerts (see description in pkix_pl_pki.h) |
- */ |
-PKIX_Error * |
-PKIX_PL_AIAMgr_GetAIACerts( |
- PKIX_PL_AIAMgr *aiaMgr, |
- PKIX_PL_Cert *prevCert, |
- void **pNBIOContext, |
- PKIX_List **pCerts, |
- void *plContext) |
-{ |
- PKIX_UInt32 numAias = 0; |
- PKIX_UInt32 aiaIndex = 0; |
- PKIX_UInt32 iaType = PKIX_INFOACCESS_LOCATION_UNKNOWN; |
- PKIX_List *certs = NULL; |
- PKIX_PL_InfoAccess *ia = NULL; |
- void *nbio = NULL; |
- |
- PKIX_ENTER(AIAMGR, "PKIX_PL_AIAMgr_GetAIACerts"); |
- PKIX_NULLCHECK_FOUR(aiaMgr, prevCert, pNBIOContext, pCerts); |
- |
- nbio = *pNBIOContext; |
- *pCerts = NULL; |
- *pNBIOContext = NULL; |
- |
- if (nbio == NULL) { /* a new request */ |
- |
- /* Does this Cert have an AIA extension? */ |
- PKIX_CHECK(PKIX_PL_Cert_GetAuthorityInfoAccess |
- (prevCert, &aiaMgr->aia, plContext), |
- PKIX_CERTGETAUTHORITYINFOACCESSFAILED); |
- |
- if (aiaMgr->aia != NULL) { |
- PKIX_CHECK(PKIX_List_GetLength |
- (aiaMgr->aia, &numAias, plContext), |
- PKIX_LISTGETLENGTHFAILED); |
- } |
- |
- /* And if so, does it have any entries? */ |
- if ((aiaMgr->aia == NULL) || (numAias == 0)) { |
- *pCerts = NULL; |
- goto cleanup; |
- } |
- |
- aiaMgr->aiaIndex = 0; |
- aiaMgr->numAias = numAias; |
- aiaMgr->results = NULL; |
- |
- } |
- |
- for (aiaIndex = aiaMgr->aiaIndex; |
- aiaIndex < aiaMgr->numAias; |
- aiaIndex ++) { |
- PKIX_UInt32 method = 0; |
- |
- PKIX_CHECK(PKIX_List_GetItem |
- (aiaMgr->aia, |
- aiaIndex, |
- (PKIX_PL_Object **)&ia, |
- plContext), |
- PKIX_LISTGETITEMFAILED); |
- |
- PKIX_CHECK(PKIX_PL_InfoAccess_GetMethod |
- (ia, &method, plContext), |
- PKIX_INFOACCESSGETMETHODFAILED); |
- |
- if (method != PKIX_INFOACCESS_CA_ISSUERS && |
- method != PKIX_INFOACCESS_CA_REPOSITORY) { |
- PKIX_DECREF(ia); |
- continue; |
- } |
- |
- PKIX_CHECK(PKIX_PL_InfoAccess_GetLocationType |
- (ia, &iaType, plContext), |
- PKIX_INFOACCESSGETLOCATIONTYPEFAILED); |
- |
- if (iaType == PKIX_INFOACCESS_LOCATION_HTTP) { |
- PKIX_CHECK(pkix_pl_AIAMgr_GetHTTPCerts |
- (aiaMgr, ia, &nbio, &certs, plContext), |
- PKIX_AIAMGRGETHTTPCERTSFAILED); |
- } else if (iaType == PKIX_INFOACCESS_LOCATION_LDAP) { |
- PKIX_CHECK(pkix_pl_AIAMgr_GetLDAPCerts |
- (aiaMgr, ia, &nbio, &certs, plContext), |
- PKIX_AIAMGRGETLDAPCERTSFAILED); |
- } else { |
- /* We only support http and ldap requests. */ |
- PKIX_DECREF(ia); |
- continue; |
- } |
- |
- if (nbio != NULL) { /* WOULDBLOCK */ |
- aiaMgr->aiaIndex = aiaIndex; |
- *pNBIOContext = nbio; |
- *pCerts = NULL; |
- goto cleanup; |
- } |
- |
- /* |
- * We can't just use and modify the List we received. |
- * Because it's cached, it's set immutable. |
- */ |
- if (aiaMgr->results == NULL) { |
- PKIX_CHECK(PKIX_List_Create |
- (&(aiaMgr->results), plContext), |
- PKIX_LISTCREATEFAILED); |
- } |
- PKIX_CHECK(pkix_List_AppendList |
- (aiaMgr->results, certs, plContext), |
- PKIX_APPENDLISTFAILED); |
- PKIX_DECREF(certs); |
- |
- PKIX_DECREF(ia); |
- } |
- |
- PKIX_DECREF(aiaMgr->aia); |
- |
- *pNBIOContext = NULL; |
- *pCerts = aiaMgr->results; |
- aiaMgr->results = NULL; |
- |
-cleanup: |
- |
- if (PKIX_ERROR_RECEIVED) { |
- PKIX_DECREF(aiaMgr->aia); |
- PKIX_DECREF(aiaMgr->results); |
- PKIX_DECREF(aiaMgr->client.ldapClient); |
- } |
- |
- PKIX_DECREF(certs); |
- PKIX_DECREF(ia); |
- |
- PKIX_RETURN(AIAMGR); |
-} |