Bug Summary

File:s/lib/libpkix/pkix_pl_nss/pki/pkix_pl_infoaccess.c
Warning:line 858, column 16
Array access (from variable 'attrArray') results in a null pointer dereference

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name pkix_pl_infoaccess.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/var/lib/jenkins/workspace/nss-scan-build/nss/lib/libpkix/pkix_pl_nss/pki -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/var/lib/jenkins/workspace/nss-scan-build/nss/lib/libpkix/pkix_pl_nss/pki -resource-dir /usr/lib/llvm-18/lib/clang/18 -D HAVE_STRERROR -D LINUX -D linux -D XP_UNIX -D XP_UNIX -D DEBUG -U NDEBUG -D _DEFAULT_SOURCE -D _BSD_SOURCE -D _POSIX_SOURCE -D SDB_MEASURE_USE_TEMP_DIR -D _REENTRANT -D DEBUG -U NDEBUG -D _DEFAULT_SOURCE -D _BSD_SOURCE -D _POSIX_SOURCE -D SDB_MEASURE_USE_TEMP_DIR -D _REENTRANT -D NSS_DISABLE_SSE3 -D NSS_NO_INIT_SUPPORT -D USE_UTIL_DIRECTLY -D NO_NSPR_10_SUPPORT -D SSL_DISABLE_DEPRECATED_CIPHER_SUITE_NAMES -I ../../../../../dist/Linux4.19_x86_64_gcc_glibc_PTH_64_DBG.OBJ/include -I ../../../../../dist/public/nss -I ../../../../../dist/private/nss -internal-isystem /usr/lib/llvm-18/lib/clang/18/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -std=c99 -ferror-limit 19 -fgnuc-version=4.2.1 -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2024-05-18-082241-28900-1 -x c pkix_pl_infoaccess.c
1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4/*
5 * pkix_pl_infoaccess.c
6 *
7 * InfoAccess Object Definitions
8 *
9 */
10
11#include "pkix_pl_infoaccess.h"
12
13/* --Private-InfoAccess-Functions----------------------------------*/
14
15/*
16 * FUNCTION: pkix_pl_InfoAccess_Create
17 * DESCRIPTION:
18 *
19 * This function creates an InfoAccess from the method provided in "method" and
20 * the GeneralName provided in "generalName" and stores the result at
21 * "pInfoAccess".
22 *
23 * PARAMETERS
24 * "method"
25 * The UInt32 value to be stored as the method field of the InfoAccess.
26 * "gName"
27 * The GeneralName to be stored as the gName field of the InfoAccess.
28 * Must be non-NULL.
29 * "pInfoAccess"
30 * Address where the result is stored. Must be non-NULL.
31 * "plContext"
32 * Platform-specific context pointer.
33 * THREAD SAFETY:
34 * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
35 * RETURNS:
36 * Returns NULL if the function succeeds.
37 * Returns a Fatal Error if the function fails in an unrecoverable way.
38 */
39static PKIX_Error *
40pkix_pl_InfoAccess_Create(
41 PKIX_UInt32 method,
42 PKIX_PL_GeneralName *gName,
43 PKIX_PL_InfoAccess **pInfoAccess,
44 void *plContext)
45{
46
47 PKIX_PL_InfoAccess *infoAccess = NULL((void*)0);
48
49 PKIX_ENTER(INFOACCESS, "pkix_pl_InfoAccess_Create")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_Create"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
50 PKIX_NULLCHECK_TWO(gName, pInfoAccess)do { if (((gName) == ((void*)0)) || ((pInfoAccess) == ((void*
)0))){ stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars
.aPkixErrorCode = PKIX_NULLARGUMENT; return PKIX_DoReturn(&
stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean) 1), plContext);;
} } while (0)
;
51
52 PKIX_CHECK(PKIX_PL_Object_Allocdo { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_INFOACCESS_TYPE
, sizeof (PKIX_PL_InfoAccess), (PKIX_PL_Object **)&infoAccess
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEINFOACCESSOBJECT; goto cleanup; } } while
(0)
53 (PKIX_INFOACCESS_TYPE,do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_INFOACCESS_TYPE
, sizeof (PKIX_PL_InfoAccess), (PKIX_PL_Object **)&infoAccess
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEINFOACCESSOBJECT; goto cleanup; } } while
(0)
54 sizeof (PKIX_PL_InfoAccess),do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_INFOACCESS_TYPE
, sizeof (PKIX_PL_InfoAccess), (PKIX_PL_Object **)&infoAccess
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEINFOACCESSOBJECT; goto cleanup; } } while
(0)
55 (PKIX_PL_Object **)&infoAccess,do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_INFOACCESS_TYPE
, sizeof (PKIX_PL_InfoAccess), (PKIX_PL_Object **)&infoAccess
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEINFOACCESSOBJECT; goto cleanup; } } while
(0)
56 plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_INFOACCESS_TYPE
, sizeof (PKIX_PL_InfoAccess), (PKIX_PL_Object **)&infoAccess
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEINFOACCESSOBJECT; goto cleanup; } } while
(0)
57 PKIX_COULDNOTCREATEINFOACCESSOBJECT)do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_INFOACCESS_TYPE
, sizeof (PKIX_PL_InfoAccess), (PKIX_PL_Object **)&infoAccess
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEINFOACCESSOBJECT; goto cleanup; } } while
(0)
;
58
59 infoAccess->method = method;
60
61 PKIX_INCREF(gName)do { if (gName){ stdVars.aPkixTempResult = PKIX_PL_Object_IncRef
((PKIX_PL_Object *)(gName), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); goto cleanup; } } } while
(0)
;
62 infoAccess->location = gName;
63
64 *pInfoAccess = infoAccess;
65 infoAccess = NULL((void*)0);
66
67cleanup:
68 PKIX_DECREF(infoAccess)do { if (infoAccess){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(infoAccess), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } infoAccess = ((void
*)0); } } while (0)
;
69
70 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
71}
72
73/*
74 * FUNCTION: pkix_pl_InfoAccess_Destroy
75 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_pki.h)
76 */
77static PKIX_Error *
78pkix_pl_InfoAccess_Destroy(
79 PKIX_PL_Object *object,
80 void *plContext)
81{
82 PKIX_PL_InfoAccess *infoAccess = NULL((void*)0);
83
84 PKIX_ENTER(INFOACCESS, "pkix_pl_InfoAccess_Destroy")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_Destroy"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
85 PKIX_NULLCHECK_ONE(object)do { if ((object) == ((void*)0)){ stdVars.aPkixErrorReceived =
((PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NULLARGUMENT
; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean
) 1), plContext);; } } while (0)
;
86
87 PKIX_CHECK(pkix_CheckType(object, PKIX_INFOACCESS_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANINFOACCESS; goto cleanup; } } while (0)
88 PKIX_OBJECTNOTANINFOACCESS)do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANINFOACCESS; goto cleanup; } } while (0)
;
89
90 infoAccess = (PKIX_PL_InfoAccess *)object;
91
92 PKIX_DECREF(infoAccess->location)do { if (infoAccess->location){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(infoAccess->location), plContext); if
(stdVars.aPkixTempResult) { PKIX_DoAddError(&stdVars, stdVars
.aPkixTempResult, plContext); stdVars.aPkixTempResult = ((void
*)0); } infoAccess->location = ((void*)0); } } while (0)
;
93
94cleanup:
95
96 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
97}
98
99/*
100 * FUNCTION: pkix_pl_InfoAccess_ToString
101 * (see comments for PKIX_PL_ToStringCallback in pkix_pl_pki.h)
102 */
103static PKIX_Error *
104pkix_pl_InfoAccess_ToString(
105 PKIX_PL_Object *object,
106 PKIX_PL_String **pString,
107 void *plContext)
108{
109 PKIX_PL_InfoAccess *infoAccess;
110 PKIX_PL_String *infoAccessString = NULL((void*)0);
111 char *asciiFormat = NULL((void*)0);
112 char *asciiMethod = NULL((void*)0);
113 PKIX_PL_String *formatString = NULL((void*)0);
114 PKIX_PL_String *methodString = NULL((void*)0);
115 PKIX_PL_String *locationString = NULL((void*)0);
116
117 PKIX_ENTER(INFOACCESS, "pkix_pl_InfoAccess_ToString")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_ToString"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
118 PKIX_NULLCHECK_TWO(object, pString)do { if (((object) == ((void*)0)) || ((pString) == ((void*)0)
)){ stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars.
aPkixErrorCode = PKIX_NULLARGUMENT; return PKIX_DoReturn(&
stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean) 1), plContext);;
} } while (0)
;
119
120 PKIX_CHECK(pkix_CheckTypedo { stdVars.aPkixErrorResult = (pkix_CheckType (object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTINFOACCESS; goto cleanup; } } while (0)
121 (object, PKIX_INFOACCESS_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckType (object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTINFOACCESS; goto cleanup; } } while (0)
122 PKIX_OBJECTNOTINFOACCESS)do { stdVars.aPkixErrorResult = (pkix_CheckType (object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTINFOACCESS; goto cleanup; } } while (0)
;
123
124 infoAccess = (PKIX_PL_InfoAccess *)object;
125
126 asciiFormat =
127 "["
128 "method:%s, "
129 "location:%s"
130 "]";
131
132 PKIX_CHECK(PKIX_PL_String_Createdo { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiFormat
, 0, &formatString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
133 (PKIX_ESCASCII,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiFormat
, 0, &formatString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
134 asciiFormat,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiFormat
, 0, &formatString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
135 0,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiFormat
, 0, &formatString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
136 &formatString,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiFormat
, 0, &formatString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
137 plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiFormat
, 0, &formatString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
138 PKIX_STRINGCREATEFAILED)do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiFormat
, 0, &formatString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
;
139
140 switch(infoAccess->method) {
141 case PKIX_INFOACCESS_CA_ISSUERS2:
142 asciiMethod = "caIssuers";
143 break;
144 case PKIX_INFOACCESS_OCSP1:
145 asciiMethod = "ocsp";
146 break;
147 case PKIX_INFOACCESS_TIMESTAMPING3:
148 asciiMethod = "timestamping";
149 break;
150 case PKIX_INFOACCESS_CA_REPOSITORY5:
151 asciiMethod = "caRepository";
152 break;
153 default:
154 asciiMethod = "unknown";
155 }
156
157 PKIX_CHECK(PKIX_PL_String_Createdo { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiMethod
, 0, &methodString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
158 (PKIX_ESCASCII,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiMethod
, 0, &methodString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
159 asciiMethod,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiMethod
, 0, &methodString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
160 0,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiMethod
, 0, &methodString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
161 &methodString,do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiMethod
, 0, &methodString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
162 plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiMethod
, 0, &methodString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
163 PKIX_STRINGCREATEFAILED)do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, asciiMethod
, 0, &methodString, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup
; } } while (0)
;
164
165 PKIX_TOSTRING(infoAccess->location, &locationString, plContext,do { int descNum; if ((infoAccess->location) != ((void*)0)
) { stdVars.aPkixErrorResult = PKIX_PL_Object_ToString((PKIX_PL_Object
*)(infoAccess->location), (&locationString), (plContext
)); descNum = (PKIX_GENERALNAMETOSTRINGFAILED); } else { stdVars
.aPkixErrorResult = PKIX_PL_String_Create(0, "(null)", 0, (&
locationString), (plContext)); descNum = PKIX_STRINGCREATEFAILED
; } do { stdVars.aPkixErrorResult = (stdVars.aPkixErrorResult
); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = descNum
; goto cleanup; } } while (0); } while (0)
166 PKIX_GENERALNAMETOSTRINGFAILED)do { int descNum; if ((infoAccess->location) != ((void*)0)
) { stdVars.aPkixErrorResult = PKIX_PL_Object_ToString((PKIX_PL_Object
*)(infoAccess->location), (&locationString), (plContext
)); descNum = (PKIX_GENERALNAMETOSTRINGFAILED); } else { stdVars
.aPkixErrorResult = PKIX_PL_String_Create(0, "(null)", 0, (&
locationString), (plContext)); descNum = PKIX_STRINGCREATEFAILED
; } do { stdVars.aPkixErrorResult = (stdVars.aPkixErrorResult
); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = descNum
; goto cleanup; } } while (0); } while (0)
;
167
168 PKIX_CHECK(PKIX_PL_Sprintfdo { stdVars.aPkixErrorResult = (PKIX_PL_Sprintf (&infoAccessString
, plContext, formatString, methodString, locationString)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_SPRINTFFAILED
; goto cleanup; } } while (0)
169 (&infoAccessString,do { stdVars.aPkixErrorResult = (PKIX_PL_Sprintf (&infoAccessString
, plContext, formatString, methodString, locationString)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_SPRINTFFAILED
; goto cleanup; } } while (0)
170 plContext,do { stdVars.aPkixErrorResult = (PKIX_PL_Sprintf (&infoAccessString
, plContext, formatString, methodString, locationString)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_SPRINTFFAILED
; goto cleanup; } } while (0)
171 formatString,do { stdVars.aPkixErrorResult = (PKIX_PL_Sprintf (&infoAccessString
, plContext, formatString, methodString, locationString)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_SPRINTFFAILED
; goto cleanup; } } while (0)
172 methodString,do { stdVars.aPkixErrorResult = (PKIX_PL_Sprintf (&infoAccessString
, plContext, formatString, methodString, locationString)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_SPRINTFFAILED
; goto cleanup; } } while (0)
173 locationString),do { stdVars.aPkixErrorResult = (PKIX_PL_Sprintf (&infoAccessString
, plContext, formatString, methodString, locationString)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_SPRINTFFAILED
; goto cleanup; } } while (0)
174 PKIX_SPRINTFFAILED)do { stdVars.aPkixErrorResult = (PKIX_PL_Sprintf (&infoAccessString
, plContext, formatString, methodString, locationString)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_SPRINTFFAILED
; goto cleanup; } } while (0)
;
175
176 *pString = infoAccessString;
177
178cleanup:
179
180 PKIX_DECREF(formatString)do { if (formatString){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(formatString), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } formatString = ((void
*)0); } } while (0)
;
181 PKIX_DECREF(methodString)do { if (methodString){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(methodString), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } methodString = ((void
*)0); } } while (0)
;
182 PKIX_DECREF(locationString)do { if (locationString){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(locationString), plContext); if (stdVars
.aPkixTempResult) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult
, plContext); stdVars.aPkixTempResult = ((void*)0); } locationString
= ((void*)0); } } while (0)
;
183
184 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
185}
186
187/*
188 * FUNCTION: pkix_pl_InfoAccess_Hashcode
189 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_pki.h)
190 */
191static PKIX_Error *
192pkix_pl_InfoAccess_Hashcode(
193 PKIX_PL_Object *object,
194 PKIX_UInt32 *pHashcode,
195 void *plContext)
196{
197 PKIX_PL_InfoAccess *infoAccess = NULL((void*)0);
198 PKIX_UInt32 infoAccessHash;
199
200 PKIX_ENTER(INFOACCESS, "pkix_pl_InfoAccess_Hashcode")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_Hashcode"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
201 PKIX_NULLCHECK_TWO(object, pHashcode)do { if (((object) == ((void*)0)) || ((pHashcode) == ((void*)
0))){ stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars
.aPkixErrorCode = PKIX_NULLARGUMENT; return PKIX_DoReturn(&
stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean) 1), plContext);;
} } while (0)
;
202
203 PKIX_CHECK(pkix_CheckTypedo { stdVars.aPkixErrorResult = (pkix_CheckType (object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTINFOACCESS; goto cleanup; } } while (0)
204 (object, PKIX_INFOACCESS_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckType (object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTINFOACCESS; goto cleanup; } } while (0)
205 PKIX_OBJECTNOTINFOACCESS)do { stdVars.aPkixErrorResult = (pkix_CheckType (object, PKIX_INFOACCESS_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTINFOACCESS; goto cleanup; } } while (0)
;
206
207 infoAccess = (PKIX_PL_InfoAccess *)object;
208
209 PKIX_HASHCODE(infoAccess->location, &infoAccessHash, plContext,do { if ((infoAccess->location) != ((void*)0)) { do { stdVars
.aPkixErrorResult = (PKIX_PL_Object_Hashcode ((PKIX_PL_Object
*)(infoAccess->location), (&infoAccessHash), (plContext
))); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= (PKIX_OBJECTHASHCODEFAILED); goto cleanup; } } while (0); }
else { *(&infoAccessHash) = 0; } } while (0)
210 PKIX_OBJECTHASHCODEFAILED)do { if ((infoAccess->location) != ((void*)0)) { do { stdVars
.aPkixErrorResult = (PKIX_PL_Object_Hashcode ((PKIX_PL_Object
*)(infoAccess->location), (&infoAccessHash), (plContext
))); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= (PKIX_OBJECTHASHCODEFAILED); goto cleanup; } } while (0); }
else { *(&infoAccessHash) = 0; } } while (0)
;
211
212 infoAccessHash += (infoAccess->method << 7);
213
214 *pHashcode = infoAccessHash;
215
216cleanup:
217
218 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
219
220}
221
222/*
223 * FUNCTION: pkix_pl_InfoAccess_Equals
224 * (see comments for PKIX_PL_Equals_Callback in pkix_pl_pki.h)
225 */
226static PKIX_Error *
227pkix_pl_InfoAccess_Equals(
228 PKIX_PL_Object *firstObject,
229 PKIX_PL_Object *secondObject,
230 PKIX_Boolean *pResult,
231 void *plContext)
232{
233 PKIX_PL_InfoAccess *firstInfoAccess = NULL((void*)0);
234 PKIX_PL_InfoAccess *secondInfoAccess = NULL((void*)0);
235 PKIX_UInt32 secondType;
236 PKIX_Boolean cmpResult;
237
238 PKIX_ENTER(INFOACCESS, "pkix_pl_InfoAccess_Equals")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_Equals"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
239 PKIX_NULLCHECK_THREE(firstObject, secondObject, pResult)do { if (((firstObject) == ((void*)0)) || ((secondObject) == (
(void*)0)) || ((pResult) == ((void*)0))){ stdVars.aPkixErrorReceived
= ((PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NULLARGUMENT
; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean
) 1), plContext);; } } while (0)
;
240
241 /* test that firstObject is a InfoAccess */
242 PKIX_CHECK(pkix_CheckTypedo { stdVars.aPkixErrorResult = (pkix_CheckType (firstObject,
PKIX_INFOACCESS_TYPE, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_FIRSTOBJECTNOTINFOACCESS; goto
cleanup; } } while (0)
243 (firstObject, PKIX_INFOACCESS_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckType (firstObject,
PKIX_INFOACCESS_TYPE, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_FIRSTOBJECTNOTINFOACCESS; goto
cleanup; } } while (0)
244 PKIX_FIRSTOBJECTNOTINFOACCESS)do { stdVars.aPkixErrorResult = (pkix_CheckType (firstObject,
PKIX_INFOACCESS_TYPE, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_FIRSTOBJECTNOTINFOACCESS; goto
cleanup; } } while (0)
;
245
246 /*
247 * Since we know firstObject is a InfoAccess, if both references are
248 * identical, they must be equal
249 */
250 if (firstObject == secondObject){
251 *pResult = PKIX_TRUE((PKIX_Boolean) 1);
252 goto cleanup;
253 }
254
255 /*
256 * If secondObject isn't a InfoAccess, we don't throw an error.
257 * We simply return a Boolean result of FALSE
258 */
259 *pResult = PKIX_FALSE((PKIX_Boolean) 0);
260 PKIX_CHECK(PKIX_PL_Object_GetTypedo { stdVars.aPkixErrorResult = (PKIX_PL_Object_GetType (secondObject
, &secondType, plContext)); if (stdVars.aPkixErrorResult)
{ stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_COULDNOTGETTYPEOFSECONDARGUMENT
; goto cleanup; } } while (0)
261 (secondObject, &secondType, plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_Object_GetType (secondObject
, &secondType, plContext)); if (stdVars.aPkixErrorResult)
{ stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_COULDNOTGETTYPEOFSECONDARGUMENT
; goto cleanup; } } while (0)
262 PKIX_COULDNOTGETTYPEOFSECONDARGUMENT)do { stdVars.aPkixErrorResult = (PKIX_PL_Object_GetType (secondObject
, &secondType, plContext)); if (stdVars.aPkixErrorResult)
{ stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_COULDNOTGETTYPEOFSECONDARGUMENT
; goto cleanup; } } while (0)
;
263 if (secondType != PKIX_INFOACCESS_TYPE) goto cleanup;
264
265 firstInfoAccess = (PKIX_PL_InfoAccess *)firstObject;
266 secondInfoAccess = (PKIX_PL_InfoAccess *)secondObject;
267
268 *pResult = PKIX_FALSE((PKIX_Boolean) 0);
269
270 if (firstInfoAccess->method != secondInfoAccess->method) {
271 goto cleanup;
272 }
273
274 PKIX_EQUALS(firstInfoAccess, secondInfoAccess, &cmpResult, plContext,do { if ((firstInfoAccess) != ((void*)0) && (secondInfoAccess
) != ((void*)0)) { do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Equals
((PKIX_PL_Object *)(firstInfoAccess), (PKIX_PL_Object*)(secondInfoAccess
), (&cmpResult), (plContext))); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = (PKIX_OBJECTEQUALSFAILED); goto cleanup
; } } while (0); } else if ((firstInfoAccess) == ((void*)0) &&
(secondInfoAccess) == ((void*)0)) { *(&cmpResult) = ((PKIX_Boolean
) 1); } else { *(&cmpResult) = ((PKIX_Boolean) 0); } } while
(0)
275 PKIX_OBJECTEQUALSFAILED)do { if ((firstInfoAccess) != ((void*)0) && (secondInfoAccess
) != ((void*)0)) { do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Equals
((PKIX_PL_Object *)(firstInfoAccess), (PKIX_PL_Object*)(secondInfoAccess
), (&cmpResult), (plContext))); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = (PKIX_OBJECTEQUALSFAILED); goto cleanup
; } } while (0); } else if ((firstInfoAccess) == ((void*)0) &&
(secondInfoAccess) == ((void*)0)) { *(&cmpResult) = ((PKIX_Boolean
) 1); } else { *(&cmpResult) = ((PKIX_Boolean) 0); } } while
(0)
;
276
277 *pResult = cmpResult;
278
279cleanup:
280
281 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
282}
283
284/*
285 * FUNCTION: pkix_pl_InfoAccess_RegisterSelf
286 * DESCRIPTION:
287 * Registers PKIX_INFOACCESS_TYPE and its related functions with systemClasses[]
288 * THREAD SAFETY:
289 * Not Thread Safe - for performance and complexity reasons
290 *
291 * Since this function is only called by PKIX_PL_Initialize, which should
292 * only be called once, it is acceptable that this function is not
293 * thread-safe.
294 */
295PKIX_Error *
296pkix_pl_InfoAccess_RegisterSelf(void *plContext)
297{
298 extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
299 pkix_ClassTable_Entry entry;
300
301 PKIX_ENTER(INFOACCESS,static const char cMyFuncName[] = {"pkix_pl_InfoAccess_RegisterSelf"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
302 "pkix_pl_InfoAccess_RegisterSelf")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_RegisterSelf"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
303
304 entry.description = "InfoAccess";
305 entry.objCounter = 0;
306 entry.typeObjectSize = sizeof(PKIX_PL_InfoAccess);
307 entry.destructor = pkix_pl_InfoAccess_Destroy;
308 entry.equalsFunction = pkix_pl_InfoAccess_Equals;
309 entry.hashcodeFunction = pkix_pl_InfoAccess_Hashcode;
310 entry.toStringFunction = pkix_pl_InfoAccess_ToString;
311 entry.comparator = NULL((void*)0);
312 entry.duplicateFunction = pkix_duplicateImmutable;
313
314 systemClasses[PKIX_INFOACCESS_TYPE] = entry;
315
316 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
317}
318
319/*
320 * FUNCTION: pkix_pl_InfoAccess_CreateList
321 * DESCRIPTION:
322 *
323 * Based on data in CERTAuthInfoAccess array "nssInfoAccess", this function
324 * creates and returns a PKIX_List of PKIX_PL_InfoAccess at "pInfoAccessList".
325 *
326 * PARAMETERS
327 * "nssInfoAccess"
328 * The pointer array of CERTAuthInfoAccess that contains access data.
329 * May be NULL.
330 * "pInfoAccessList"
331 * Address where a list of PKIX_PL_InfoAccess is returned.
332 * Must be non-NULL.
333 * "plContext"
334 * Platform-specific context pointer.
335 * THREAD SAFETY:
336 * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
337 * RETURNS:
338 * Returns NULL if the function succeeds.
339 * Returns a Fatal Error if the function fails in an unrecoverable way.
340 */
341PKIX_Error *
342pkix_pl_InfoAccess_CreateList(
343 CERTAuthInfoAccess **nssInfoAccess,
344 PKIX_List **pInfoAccessList, /* of PKIX_PL_InfoAccess */
345 void *plContext)
346{
347 PKIX_List *infoAccessList = NULL((void*)0);
348 PKIX_PL_InfoAccess *infoAccess = NULL((void*)0);
349 PKIX_PL_GeneralName *location = NULL((void*)0);
350 PKIX_UInt32 method;
351 int i;
352
353 PKIX_ENTER(INFOACCESS, "PKIX_PL_InfoAccess_CreateList")static const char cMyFuncName[] = {"PKIX_PL_InfoAccess_CreateList"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
354 PKIX_NULLCHECK_ONE(pInfoAccessList)do { if ((pInfoAccessList) == ((void*)0)){ stdVars.aPkixErrorReceived
= ((PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NULLARGUMENT
; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean
) 1), plContext);; } } while (0)
;
355
356 PKIX_CHECK(PKIX_List_Create(&infoAccessList, plContext),do { stdVars.aPkixErrorResult = (PKIX_List_Create(&infoAccessList
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_LISTCREATEFAILED; goto cleanup; } } while (0)
357 PKIX_LISTCREATEFAILED)do { stdVars.aPkixErrorResult = (PKIX_List_Create(&infoAccessList
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_LISTCREATEFAILED; goto cleanup; } } while (0)
;
358
359 if (nssInfoAccess == NULL((void*)0)) {
360 goto cleanup;
361 }
362
363 for (i = 0; nssInfoAccess[i] != NULL((void*)0); i++) {
364
365 if (nssInfoAccess[i]->location == NULL((void*)0)) {
366 continue;
367 }
368
369 PKIX_CHECK(pkix_pl_GeneralName_Createdo { stdVars.aPkixErrorResult = (pkix_pl_GeneralName_Create (
nssInfoAccess[i]->location, &location, plContext)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_GENERALNAMECREATEFAILED
; goto cleanup; } } while (0)
370 (nssInfoAccess[i]->location, &location, plContext),do { stdVars.aPkixErrorResult = (pkix_pl_GeneralName_Create (
nssInfoAccess[i]->location, &location, plContext)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_GENERALNAMECREATEFAILED
; goto cleanup; } } while (0)
371 PKIX_GENERALNAMECREATEFAILED)do { stdVars.aPkixErrorResult = (pkix_pl_GeneralName_Create (
nssInfoAccess[i]->location, &location, plContext)); if
(stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_GENERALNAMECREATEFAILED
; goto cleanup; } } while (0)
;
372
373 PKIX_CERT_DEBUG("\t\tCalling SECOID_FindOIDTag).\n");
374 method = SECOID_FindOIDTagSECOID_FindOIDTag_Util(&nssInfoAccess[i]->method);
375 /* Map NSS access method value into PKIX constant */
376 switch(method) {
377 case SEC_OID_PKIX_CA_ISSUERS:
378 method = PKIX_INFOACCESS_CA_ISSUERS2;
379 break;
380 case SEC_OID_PKIX_OCSP:
381 method = PKIX_INFOACCESS_OCSP1;
382 break;
383 case SEC_OID_PKIX_TIMESTAMPING:
384 method = PKIX_INFOACCESS_TIMESTAMPING3;
385 break;
386 case SEC_OID_PKIX_CA_REPOSITORY:
387 method = PKIX_INFOACCESS_CA_REPOSITORY5;
388 break;
389 default:
390 PKIX_ERROR(PKIX_UNKNOWNINFOACCESSMETHOD){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_UNKNOWNINFOACCESSMETHOD, ((void*)0), stdVars.aPkixType
, 2, plContext); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean
) 1); stdVars.aPkixErrorCode = PKIX_UNKNOWNINFOACCESSMETHOD; goto
cleanup; }
;
391 }
392
393 PKIX_CHECK(pkix_pl_InfoAccess_Createdo { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_Create (method
, location, &infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_INFOACCESSCREATEFAILED; goto cleanup
; } } while (0)
394 (method, location, &infoAccess, plContext),do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_Create (method
, location, &infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_INFOACCESSCREATEFAILED; goto cleanup
; } } while (0)
395 PKIX_INFOACCESSCREATEFAILED)do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_Create (method
, location, &infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_INFOACCESSCREATEFAILED; goto cleanup
; } } while (0)
;
396
397 PKIX_CHECK(PKIX_List_AppendItemdo { stdVars.aPkixErrorResult = (PKIX_List_AppendItem (infoAccessList
, (PKIX_PL_Object *)infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
398 (infoAccessList,do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem (infoAccessList
, (PKIX_PL_Object *)infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
399 (PKIX_PL_Object *)infoAccess,do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem (infoAccessList
, (PKIX_PL_Object *)infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
400 plContext),do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem (infoAccessList
, (PKIX_PL_Object *)infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
401 PKIX_LISTAPPENDITEMFAILED)do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem (infoAccessList
, (PKIX_PL_Object *)infoAccess, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
;
402 PKIX_DECREF(infoAccess)do { if (infoAccess){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(infoAccess), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } infoAccess = ((void
*)0); } } while (0)
;
403 PKIX_DECREF(location)do { if (location){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(location), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } location = ((void*
)0); } } while (0)
;
404 }
405
406 *pInfoAccessList = infoAccessList;
407 infoAccessList = NULL((void*)0);
408
409cleanup:
410
411 PKIX_DECREF(infoAccessList)do { if (infoAccessList){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(infoAccessList), plContext); if (stdVars
.aPkixTempResult) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult
, plContext); stdVars.aPkixTempResult = ((void*)0); } infoAccessList
= ((void*)0); } } while (0)
;
412 PKIX_DECREF(infoAccess)do { if (infoAccess){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(infoAccess), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } infoAccess = ((void
*)0); } } while (0)
;
413 PKIX_DECREF(location)do { if (location){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(location), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } location = ((void*
)0); } } while (0)
;
414
415 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
416}
417
418/* --Public-Functions------------------------------------------------------- */
419
420/*
421 * FUNCTION: PKIX_PL_InfoAccess_GetMethod (see comments in pkix_pl_pki.h)
422 */
423PKIX_Error *
424PKIX_PL_InfoAccess_GetMethod(
425 PKIX_PL_InfoAccess *infoAccess,
426 PKIX_UInt32 *pMethod,
427 void *plContext)
428{
429 PKIX_ENTER(INFOACCESS, "PKIX_PL_InfoAccess_GetMethod")static const char cMyFuncName[] = {"PKIX_PL_InfoAccess_GetMethod"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
430 PKIX_NULLCHECK_TWO(infoAccess, pMethod)do { if (((infoAccess) == ((void*)0)) || ((pMethod) == ((void
*)0))){ stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars
.aPkixErrorCode = PKIX_NULLARGUMENT; return PKIX_DoReturn(&
stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean) 1), plContext);;
} } while (0)
;
431
432 *pMethod = infoAccess->method;
433
434 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
435}
436
437/*
438 * FUNCTION: PKIX_PL_InfoAccess_GetLocation (see comments in pkix_pl_pki.h)
439 */
440PKIX_Error *
441PKIX_PL_InfoAccess_GetLocation(
442 PKIX_PL_InfoAccess *infoAccess,
443 PKIX_PL_GeneralName **pLocation,
444 void *plContext)
445{
446 PKIX_ENTER(INFOACCESS, "PKIX_PL_InfoAccess_GetLocation")static const char cMyFuncName[] = {"PKIX_PL_InfoAccess_GetLocation"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
447 PKIX_NULLCHECK_TWO(infoAccess, pLocation)do { if (((infoAccess) == ((void*)0)) || ((pLocation) == ((void
*)0))){ stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars
.aPkixErrorCode = PKIX_NULLARGUMENT; return PKIX_DoReturn(&
stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean) 1), plContext);;
} } while (0)
;
448
449 PKIX_INCREF(infoAccess->location)do { if (infoAccess->location){ stdVars.aPkixTempResult = PKIX_PL_Object_IncRef
((PKIX_PL_Object *)(infoAccess->location), plContext); if
(stdVars.aPkixTempResult) { PKIX_DoAddError(&stdVars, stdVars
.aPkixTempResult, plContext); stdVars.aPkixTempResult = ((void
*)0); goto cleanup; } } } while (0)
;
450
451 *pLocation = infoAccess->location;
452
453cleanup:
454 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
455}
456
457/*
458 * FUNCTION: PKIX_PL_InfoAccess_GetLocationType (see comments in pkix_pl_pki.h)
459 */
460PKIX_Error *
461PKIX_PL_InfoAccess_GetLocationType(
462 PKIX_PL_InfoAccess *infoAccess,
463 PKIX_UInt32 *pType,
464 void *plContext)
465{
466 PKIX_PL_String *locationString = NULL((void*)0);
467 PKIX_UInt32 type = PKIX_INFOACCESS_LOCATION_UNKNOWN0;
468 PKIX_UInt32 len = 0;
469 void *location = NULL((void*)0);
470
471 PKIX_ENTER(INFOACCESS, "PKIX_PL_InfoAccess_GetLocationType")static const char cMyFuncName[] = {"PKIX_PL_InfoAccess_GetLocationType"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
472 PKIX_NULLCHECK_TWO(infoAccess, pType)do { if (((infoAccess) == ((void*)0)) || ((pType) == ((void*)
0))){ stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars
.aPkixErrorCode = PKIX_NULLARGUMENT; return PKIX_DoReturn(&
stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean) 1), plContext);;
} } while (0)
;
473
474 if (infoAccess->location != NULL((void*)0)) {
475
476 PKIX_TOSTRING(infoAccess->location, &locationString, plContext,do { int descNum; if ((infoAccess->location) != ((void*)0)
) { stdVars.aPkixErrorResult = PKIX_PL_Object_ToString((PKIX_PL_Object
*)(infoAccess->location), (&locationString), (plContext
)); descNum = (PKIX_GENERALNAMETOSTRINGFAILED); } else { stdVars
.aPkixErrorResult = PKIX_PL_String_Create(0, "(null)", 0, (&
locationString), (plContext)); descNum = PKIX_STRINGCREATEFAILED
; } do { stdVars.aPkixErrorResult = (stdVars.aPkixErrorResult
); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = descNum
; goto cleanup; } } while (0); } while (0)
477 PKIX_GENERALNAMETOSTRINGFAILED)do { int descNum; if ((infoAccess->location) != ((void*)0)
) { stdVars.aPkixErrorResult = PKIX_PL_Object_ToString((PKIX_PL_Object
*)(infoAccess->location), (&locationString), (plContext
)); descNum = (PKIX_GENERALNAMETOSTRINGFAILED); } else { stdVars
.aPkixErrorResult = PKIX_PL_String_Create(0, "(null)", 0, (&
locationString), (plContext)); descNum = PKIX_STRINGCREATEFAILED
; } do { stdVars.aPkixErrorResult = (stdVars.aPkixErrorResult
); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = descNum
; goto cleanup; } } while (0); } while (0)
;
478
479 PKIX_CHECK(PKIX_PL_String_GetEncodeddo { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, &location, &len, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED; goto cleanup
; } } while (0)
480 (locationString, PKIX_ESCASCII, &location, &len, plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, &location, &len, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED; goto cleanup
; } } while (0)
481 PKIX_STRINGGETENCODEDFAILED)do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, &location, &len, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED; goto cleanup
; } } while (0)
;
482
483 PKIX_OID_DEBUG("\tCalling PORT_Strcmp).\n");
484#ifndef NSS_PKIX_NO_LDAP
485 if (PORT_Strncmpstrncmp(location, "ldap:", 5) == 0){
486 type = PKIX_INFOACCESS_LOCATION_LDAP2;
487 } else
488#endif
489 if (PORT_Strncmpstrncmp(location, "http:", 5) == 0){
490 type = PKIX_INFOACCESS_LOCATION_HTTP1;
491 }
492 }
493
494 *pType = type;
495
496cleanup:
497
498 PKIX_PL_Free(location, plContext);
499 PKIX_DECREF(locationString)do { if (locationString){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(locationString), plContext); if (stdVars
.aPkixTempResult) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult
, plContext); stdVars.aPkixTempResult = ((void*)0); } locationString
= ((void*)0); } } while (0)
;
500
501 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
502}
503
504#ifndef NSS_PKIX_NO_LDAP
505/*
506 * FUNCTION: pkix_pl_InfoAccess_ParseTokens
507 * DESCRIPTION:
508 *
509 * This function parses the string beginning at "startPos" into tokens using
510 * the separator contained in "separator" and the terminator contained in
511 * "terminator", copying the tokens into space allocated from the arena
512 * pointed to by "arena". It stores in "tokens" a null-terminated array of
513 * pointers to those tokens.
514 *
515 * PARAMETERS
516 * "arena"
517 * Address of a PLArenaPool to be used in populating the LDAPLocation.
518 * Must be non-NULL.
519 * "startPos"
520 * The address of char string that contains a subset of ldap location.
521 * "tokens"
522 * The address of an array of char string for storing returned tokens.
523 * Must be non-NULL.
524 * "separator"
525 * The character that is taken as token separator. Must be non-NULL.
526 * "terminator"
527 * The character that is taken as parsing terminator. Must be non-NULL.
528 * "plContext"
529 * Platform-specific context pointer.
530 * THREAD SAFETY:
531 * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
532 * RETURNS:
533 * Returns NULL if the function succeeds.
534 * Returns an InfoAccess Error if the function fails in a non-fatal way.
535 * Returns a Fatal Error if the function fails in an unrecoverable way.
536 */
537static PKIX_Error *
538pkix_pl_InfoAccess_ParseTokens(
539 PLArenaPool *arena,
540 char **startPos, /* return update */
541 char ***tokens,
542 char separator,
543 char terminator,
544 void *plContext)
545{
546 PKIX_UInt32 numFilters = 0;
547 char *endPos = NULL((void*)0);
548 char **filterP = NULL((void*)0);
549
550 PKIX_ENTER(INFOACCESS, "pkix_pl_InfoAccess_ParseTokens")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_ParseTokens"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
31
Assuming 'pkixLoggersDebugTrace' is null
32
Taking false branch
74
Assuming 'pkixLoggersDebugTrace' is null
75
Taking false branch
551 PKIX_NULLCHECK_THREE(arena, startPos, tokens)do { if (((arena) == ((void*)0)) || ((startPos) == ((void*)0)
) || ((tokens) == ((void*)0))){ stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NULLARGUMENT
; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean
) 1), plContext);; } } while (0)
;
33
Loop condition is false. Exiting loop
34
Taking false branch
35
Loop condition is false. Exiting loop
76
Loop condition is false. Exiting loop
77
Taking false branch
78
Loop condition is false. Exiting loop
552
553 endPos = *startPos;
554
555 /* First pass: parse to <terminator> to count number of components */
556 numFilters = 0;
557 while (*endPos != terminator && *endPos != '\0') {
36
Assuming the condition is true
37
Assuming the condition is true
38
Loop condition is true. Entering loop body
40
Taking false branch
41
Assuming the condition is false
79
Loop condition is true. Entering loop body
80
Taking false branch
81
Loop condition is true. Entering loop body
83
Taking false branch
84
Assuming the condition is false
558 endPos++;
559 if (*endPos == separator) {
39
Assuming the condition is false
82
Assuming the condition is false
560 numFilters++;
561 }
562 }
563
564 if (*endPos != terminator) {
565 PKIX_ERROR(PKIX_LOCATIONSTRINGNOTPROPERLYTERMINATED){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_LOCATIONSTRINGNOTPROPERLYTERMINATED, ((void*)0), stdVars
.aPkixType, 2, plContext); } } stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_LOCATIONSTRINGNOTPROPERLYTERMINATED
; goto cleanup; }
;
566 }
567
568 /* Last component doesn't need a separator, although we allow it */
569 if (endPos > *startPos && *(endPos-1) != separator) {
42
Assuming the condition is true
43
Taking true branch
85
Taking true branch
570 numFilters++;
571 }
572
573 /*
574 * If string is a=xx, b=yy, c=zz, etc., use a=xx for filter,
575 * and everything else for the base
576 */
577 if (numFilters
43.1
'numFilters' is <= 2
85.1
'numFilters' is <= 2
> 2) numFilters = 2;
44
Taking false branch
86
Taking false branch
578
579 filterP = PORT_ArenaZNewArray(arena, char*, numFilters+1)(char* *)PORT_ArenaZAlloc_Util(arena, sizeof(char*) * (numFilters
+1))
;
580 if (filterP == NULL((void*)0)) {
45
Assuming 'filterP' is not equal to NULL
46
Taking false branch
87
Assuming 'filterP' is equal to NULL
88
Taking true branch
581 PKIX_ERROR(PKIX_PORTARENAALLOCFAILED){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_PORTARENAALLOCFAILED, ((void*)0), stdVars.aPkixType, 2
, plContext); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean
) 1); stdVars.aPkixErrorCode = PKIX_PORTARENAALLOCFAILED; goto
cleanup; }
;
89
Assuming 'pkixLoggersErrors' is null
90
Taking false branch
91
Control jumps to line 621
582 }
583
584 /* Second pass: parse to fill in components in token array */
585 *tokens = filterP;
586 endPos = *startPos;
587
588 while (numFilters) {
589 if (*endPos == separator || *endPos == terminator) {
47
Taking false branch
48
Taking true branch
590 PKIX_UInt32 len = endPos - *startPos;
591 char *p = PORT_ArenaZAllocPORT_ArenaZAlloc_Util(arena, len+1);
592 if (p == NULL((void*)0)) {
49
Assuming 'p' is equal to NULL
50
Taking true branch
593 PKIX_ERROR(PKIX_PORTARENAALLOCFAILED){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_PORTARENAALLOCFAILED, ((void*)0), stdVars.aPkixType, 2
, plContext); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean
) 1); stdVars.aPkixErrorCode = PKIX_PORTARENAALLOCFAILED; goto
cleanup; }
;
51
Assuming 'pkixLoggersErrors' is null
52
Taking false branch
53
Control jumps to line 621
594 }
595
596 PORT_Memcpymemcpy(p, *startPos, len);
597 p[len] = '\0';
598
599 *filterP = p;
600 filterP++;
601 numFilters--;
602
603 separator = terminator;
604
605 if (*endPos == '\0') {
606 *startPos = endPos;
607 break;
608 } else {
609 endPos++;
610 *startPos = endPos;
611 continue;
612 }
613 }
614 endPos++;
615 }
616
617 *filterP = NULL((void*)0);
618
619cleanup:
620
621 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
54
Returning pointer, which participates in a condition later
92
Returning without writing to '*tokens'
93
Returning pointer, which participates in a condition later
622}
623
624static int
625pkix_pl_HexDigitToInt(
626 int ch)
627{
628 if (isdigit(ch)((*__ctype_b_loc ())[(int) ((ch))] & (unsigned short int)
_ISdigit)
) {
629 ch = ch - '0';
630 } else if (isupper(ch)((*__ctype_b_loc ())[(int) ((ch))] & (unsigned short int)
_ISupper)
) {
631 ch = ch - 'A' + 10;
632 } else {
633 ch = ch - 'a' + 10;
634 }
635 return ch;
636}
637
638/*
639 * Convert the "%" hex hex escape sequences in the URL 'location' in place.
640 */
641static void
642pkix_pl_UnescapeURL(
643 char *location)
644{
645 const char *src;
646 char *dst;
647
648 for (src = dst = location; *src != '\0'; src++, dst++) {
649 if (*src == '%' && isxdigit((unsigned char)*(src+1))((*__ctype_b_loc ())[(int) (((unsigned char)*(src+1)))] &
(unsigned short int) _ISxdigit)
&&
650 isxdigit((unsigned char)*(src+2))((*__ctype_b_loc ())[(int) (((unsigned char)*(src+2)))] &
(unsigned short int) _ISxdigit)
) {
651 *dst = pkix_pl_HexDigitToInt((unsigned char)*(src+1));
652 *dst *= 16;
653 *dst += pkix_pl_HexDigitToInt((unsigned char)*(src+2));
654 src += 2;
655 } else {
656 *dst = *src;
657 }
658 }
659 *dst = *src; /* the terminating null */
660}
661
662/*
663 * FUNCTION: pkix_pl_InfoAccess_ParseLocation
664 * DESCRIPTION:
665 *
666 * This function parses the GeneralName pointed to by "generalName" into the
667 * fields of the LDAPRequestParams pointed to by "request" and a domainName
668 * pointed to by "pDomainName", using the PLArenaPool pointed to by "arena" to
669 * allocate storage for the request components and for the domainName string.
670 *
671 * The expected GeneralName string should be in the format described by the
672 * following BNF:
673 *
674 * ldap://<ldap-server-site>/[cn=<cname>][,o=<org>][,c=<country>]?
675 * [caCertificate|crossCertificatPair|certificateRevocationList];
676 * [binary|<other-type>]
677 * [[,caCertificate|crossCertificatPair|certificateRevocationList]
678 * [binary|<other-type>]]*
679 *
680 * PARAMETERS
681 * "gName"
682 * Address of the GeneralName whose LDAPLocation is to be parsed. Must be
683 * non-NULL.
684 * "arena"
685 * Address of PLArenaPool to be used for the domainName and for components
686 * of the LDAPRequest. Must be non-NULL.
687 * "request"
688 * Address of the LDAPRequestParams into which request components are
689 * stored. Must be non-NULL.
690 * *pDomainName"
691 * Address at which the domainName is stored. Must be non-NULL.
692 * "plContext"
693 * Platform-specific context pointer.
694 * THREAD SAFETY:
695 * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
696 * RETURNS:
697 * Returns NULL if the function succeeds.
698 * Returns an InfoAccess Error if the function fails in a non-fatal way.
699 * Returns a Fatal Error if the function fails in an unrecoverable way.
700 */
701PKIX_Error *
702pkix_pl_InfoAccess_ParseLocation(
703 PKIX_PL_GeneralName *gName,
704 PLArenaPool *arena,
705 LDAPRequestParams *request,
706 char **pDomainName,
707 void *plContext)
708{
709 PKIX_PL_String *locationString = NULL((void*)0);
710 PKIX_UInt32 len = 0;
711 PKIX_UInt32 ncIndex = 0;
712 char *domainName = NULL((void*)0);
713 char **avaArray = NULL((void*)0);
714 char **attrArray = NULL((void*)0);
1
'attrArray' initialized to a null pointer value
715 char *attr = NULL((void*)0);
716 char *locationAscii = NULL((void*)0);
717 char *startPos = NULL((void*)0);
718 char *endPos = NULL((void*)0);
719 char *avaPtr = NULL((void*)0);
720 LdapAttrMask attrBit = 0;
721 LDAPNameComponent **setOfNameComponent = NULL((void*)0);
722 LDAPNameComponent *nameComponent = NULL((void*)0);
723
724 PKIX_ENTER(INFOACCESS, "pkix_pl_InfoAccess_ParseLocation")static const char cMyFuncName[] = {"pkix_pl_InfoAccess_ParseLocation"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_INFOACCESS_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
2
Assuming 'pkixLoggersDebugTrace' is null
3
Taking false branch
725 PKIX_NULLCHECK_FOUR(gName, arena, request, pDomainName)do { if (((gName) == ((void*)0)) || ((arena) == ((void*)0)) ||
((request) == ((void*)0)) || ((pDomainName) == ((void*)0))){
stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars.aPkixErrorCode
= PKIX_NULLARGUMENT; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR
), ((PKIX_Boolean) 1), plContext);; } } while (0)
;
4
Loop condition is false. Exiting loop
5
Assuming 'gName' is not equal to null
6
Assuming 'arena' is not equal to null
7
Assuming 'request' is not equal to null
8
Assuming 'pDomainName' is not equal to null
9
Taking false branch
10
Loop condition is false. Exiting loop
726
727 PKIX_TOSTRING(gName, &locationString, plContext,do { int descNum; if ((gName) != ((void*)0)) { stdVars.aPkixErrorResult
= PKIX_PL_Object_ToString((PKIX_PL_Object *)(gName), (&locationString
), (plContext)); descNum = (PKIX_GENERALNAMETOSTRINGFAILED); }
else { stdVars.aPkixErrorResult = PKIX_PL_String_Create(0, "(null)"
, 0, (&locationString), (plContext)); descNum = PKIX_STRINGCREATEFAILED
; } do { stdVars.aPkixErrorResult = (stdVars.aPkixErrorResult
); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = descNum
; goto cleanup; } } while (0); } while (0)
11
Taking true branch
12
Assuming field 'aPkixErrorResult' is null
13
Taking false branch
14
Loop condition is false. Exiting loop
15
Loop condition is false. Exiting loop
728 PKIX_GENERALNAMETOSTRINGFAILED)do { int descNum; if ((gName) != ((void*)0)) { stdVars.aPkixErrorResult
= PKIX_PL_Object_ToString((PKIX_PL_Object *)(gName), (&locationString
), (plContext)); descNum = (PKIX_GENERALNAMETOSTRINGFAILED); }
else { stdVars.aPkixErrorResult = PKIX_PL_String_Create(0, "(null)"
, 0, (&locationString), (plContext)); descNum = PKIX_STRINGCREATEFAILED
; } do { stdVars.aPkixErrorResult = (stdVars.aPkixErrorResult
); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = descNum
; goto cleanup; } } while (0); } while (0)
;
729
730 PKIX_CHECK(PKIX_PL_String_GetEncodeddo { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, (void **)&locationAscii, &len, plContext)); if (
stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED
; goto cleanup; } } while (0)
16
Assuming field 'aPkixErrorResult' is null
17
Taking false branch
18
Loop condition is false. Exiting loop
731 (locationString,do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, (void **)&locationAscii, &len, plContext)); if (
stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED
; goto cleanup; } } while (0)
732 PKIX_ESCASCII,do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, (void **)&locationAscii, &len, plContext)); if (
stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED
; goto cleanup; } } while (0)
733 (void **)&locationAscii,do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, (void **)&locationAscii, &len, plContext)); if (
stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED
; goto cleanup; } } while (0)
734 &len,do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, (void **)&locationAscii, &len, plContext)); if (
stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED
; goto cleanup; } } while (0)
735 plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, (void **)&locationAscii, &len, plContext)); if (
stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED
; goto cleanup; } } while (0)
736 PKIX_STRINGGETENCODEDFAILED)do { stdVars.aPkixErrorResult = (PKIX_PL_String_GetEncoded (locationString
, 0, (void **)&locationAscii, &len, plContext)); if (
stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass = stdVars
.aPkixErrorResult->errClass; stdVars.aPkixErrorCode = PKIX_STRINGGETENCODEDFAILED
; goto cleanup; } } while (0)
;
737
738 pkix_pl_UnescapeURL(locationAscii);
739
740 /* Skip "ldap:" */
741 endPos = locationAscii;
742 while (*endPos != ':' && *endPos != '\0') {
19
Assuming the condition is false
743 endPos++;
744 }
745 if (*endPos == '\0') {
20
Taking false branch
746 PKIX_ERROR(PKIX_GENERALNAMESTRINGMISSINGLOCATIONTYPE){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_GENERALNAMESTRINGMISSINGLOCATIONTYPE, ((void*)0), stdVars
.aPkixType, 2, plContext); } } stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_GENERALNAMESTRINGMISSINGLOCATIONTYPE
; goto cleanup; }
;
747 }
748
749 /* Skip "//" */
750 endPos++;
751 if (*endPos != '\0' && *(endPos+1) != '0' &&
21
Assuming the condition is true
22
Assuming the condition is true
25
Taking true branch
752 *endPos == '/' && *(endPos+1) == '/') {
23
Assuming the condition is true
24
Assuming the condition is true
753 endPos += 2;
754 } else {
755 PKIX_ERROR(PKIX_GENERALNAMESTRINGMISSINGDOUBLESLASH){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_GENERALNAMESTRINGMISSINGDOUBLESLASH, ((void*)0), stdVars
.aPkixType, 2, plContext); } } stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_GENERALNAMESTRINGMISSINGDOUBLESLASH
; goto cleanup; }
;
756 }
757
758 /* Get the server-site */
759 startPos = endPos;
760 while(*endPos != '/' && *(endPos) != '\0') {
26
Assuming the condition is false
761 endPos++;
762 }
763 if (*endPos == '\0') {
27
Taking false branch
764 PKIX_ERROR(PKIX_GENERALNAMESTRINGMISSINGSERVERSITE){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_GENERALNAMESTRINGMISSINGSERVERSITE, ((void*)0), stdVars
.aPkixType, 2, plContext); } } stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_GENERALNAMESTRINGMISSINGSERVERSITE
; goto cleanup; }
;
765 }
766
767 len = endPos - startPos;
768 endPos++;
769
770 domainName = PORT_ArenaZAllocPORT_ArenaZAlloc_Util(arena, len + 1);
771 if (!domainName) {
28
Assuming 'domainName' is non-null
29
Taking false branch
772 PKIX_ERROR(PKIX_PORTARENAALLOCFAILED){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_PORTARENAALLOCFAILED, ((void*)0), stdVars.aPkixType, 2
, plContext); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean
) 1); stdVars.aPkixErrorCode = PKIX_PORTARENAALLOCFAILED; goto
cleanup; }
;
773 }
774
775 PORT_Memcpymemcpy(domainName, startPos, len);
776
777 domainName[len] = '\0';
778
779 *pDomainName = domainName;
780
781 /*
782 * Get a list of AttrValueAssertions (such as
783 * "cn=CommonName, o=Organization, c=US" into a null-terminated array
784 */
785 startPos = endPos;
786 PKIX_CHECK(pkix_pl_InfoAccess_ParseTokensdo { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
30
Calling 'pkix_pl_InfoAccess_ParseTokens'
55
Returning from 'pkix_pl_InfoAccess_ParseTokens'
56
Assuming field 'aPkixErrorResult' is null
57
Taking false branch
58
Loop condition is false. Exiting loop
787 (arena,do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
788 &startPos,do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
789 (char ***) &avaArray,do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
790 ',',do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
791 '?',do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
792 plContext),do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
793 PKIX_INFOACCESSPARSETOKENSFAILED)do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, &startPos, (char ***) &avaArray, ',', '?', plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup; } } while (
0)
;
794
795 /* Count how many AVAs we have */
796 for (len = 0; avaArray[len] != NULL((void*)0); len++) {}
59
Assuming the condition is true
60
Loop condition is true. Entering loop body
61
Assuming the condition is true
62
Loop condition is true. Entering loop body
63
Assuming the condition is false
64
Loop condition is false. Execution continues on line 798
797
798 if (len
64.1
'len' is >= 2
< 2) {
65
Taking false branch
799 PKIX_ERROR(PKIX_NOTENOUGHNAMECOMPONENTSINGENERALNAME){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_NOTENOUGHNAMECOMPONENTSINGENERALNAME, ((void*)0), stdVars
.aPkixType, 2, plContext); } } stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NOTENOUGHNAMECOMPONENTSINGENERALNAME
; goto cleanup; }
;
800 }
801
802 /* Use last name component for baseObject */
803 request->baseObject = avaArray[len - 1];
804
805 /* Use only one component for filter. LDAP servers aren't too smart. */
806 len = 2; /* Eliminate this when servers get smarter. */
807
808 avaArray[len - 1] = NULL((void*)0);
809
810 /* Get room for null-terminated array of (LdapNameComponent *) */
811 setOfNameComponent = PORT_ArenaZNewArray(arena, LDAPNameComponent *, len)(LDAPNameComponent * *)PORT_ArenaZAlloc_Util(arena, sizeof(LDAPNameComponent
*) * (len))
;
812 if (setOfNameComponent == NULL((void*)0)) {
66
Assuming 'setOfNameComponent' is not equal to NULL
67
Taking false branch
813 PKIX_ERROR(PKIX_PORTARENAALLOCFAILED){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_PORTARENAALLOCFAILED, ((void*)0), stdVars.aPkixType, 2
, plContext); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean
) 1); stdVars.aPkixErrorCode = PKIX_PORTARENAALLOCFAILED; goto
cleanup; }
;
814 }
815
816 /* Get room for the remaining LdapNameComponents */
817 nameComponent = PORT_ArenaZNewArray(arena, LDAPNameComponent, --len)(LDAPNameComponent *)PORT_ArenaZAlloc_Util(arena, sizeof(LDAPNameComponent
) * (--len))
;
818 if (nameComponent == NULL((void*)0)) {
68
Assuming 'nameComponent' is not equal to NULL
69
Taking false branch
819 PKIX_ERROR(PKIX_PORTARENAALLOCFAILED){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_PORTARENAALLOCFAILED, ((void*)0), stdVars.aPkixType, 2
, plContext); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean
) 1); stdVars.aPkixErrorCode = PKIX_PORTARENAALLOCFAILED; goto
cleanup; }
;
820 }
821
822 /* Convert remaining AVAs to LDAPNameComponents */
823 for (ncIndex = 0; ncIndex < len; ncIndex ++) {
70
Loop condition is true. Entering loop body
72
Loop condition is false. Execution continues on line 838
824 setOfNameComponent[ncIndex] = nameComponent;
825 avaPtr = avaArray[ncIndex];
826 nameComponent->attrType = (unsigned char *)avaPtr;
827 while ((*avaPtr != '=') && (*avaPtr != '\0')) {
71
Assuming the condition is false
828 avaPtr++;
829 if (*avaPtr == '\0') {
830 PKIX_ERROR(PKIX_NAMECOMPONENTWITHNOEQ){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_NAMECOMPONENTWITHNOEQ, ((void*)0), stdVars.aPkixType, 2
, plContext); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean
) 1); stdVars.aPkixErrorCode = PKIX_NAMECOMPONENTWITHNOEQ; goto
cleanup; }
;
831 }
832 }
833 *(avaPtr++) = '\0';
834 nameComponent->attrValue = (unsigned char *)avaPtr;
835 nameComponent++;
836 }
837
838 setOfNameComponent[len] = NULL((void*)0);
839 request->nc = setOfNameComponent;
840
841 /*
842 * Get a list of AttrTypes (such as
843 * "caCertificate;binary, crossCertificatePair;binary") into
844 * a null-terminated array
845 */
846
847 PKIX_CHECK(pkix_pl_InfoAccess_ParseTokensdo { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
73
Calling 'pkix_pl_InfoAccess_ParseTokens'
94
Returning from 'pkix_pl_InfoAccess_ParseTokens'
95
Assuming field 'aPkixErrorResult' is null
96
Taking false branch
97
Loop condition is false. Exiting loop
848 (arena,do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
849 (char **) &startPos,do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
850 (char ***) &attrArray,do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
851 ',',do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
852 '\0',do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
853 plContext),do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
854 PKIX_INFOACCESSPARSETOKENSFAILED)do { stdVars.aPkixErrorResult = (pkix_pl_InfoAccess_ParseTokens
(arena, (char **) &startPos, (char ***) &attrArray, ','
, '\0', plContext)); if (stdVars.aPkixErrorResult) { stdVars.
aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_INFOACCESSPARSETOKENSFAILED; goto cleanup
; } } while (0)
;
855
856 /* Convert array of Attr Types into a bit mask */
857 request->attributes = 0;
858 attr = attrArray[0];
98
Array access (from variable 'attrArray') results in a null pointer dereference
859 while (attr != NULL((void*)0)) {
860 PKIX_CHECK(pkix_pl_LdapRequest_AttrStringToBitdo { stdVars.aPkixErrorResult = (pkix_pl_LdapRequest_AttrStringToBit
(attr, &attrBit, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LDAPREQUESTATTRSTRINGTOBITFAILED
; goto cleanup; } } while (0)
861 (attr, &attrBit, plContext),do { stdVars.aPkixErrorResult = (pkix_pl_LdapRequest_AttrStringToBit
(attr, &attrBit, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LDAPREQUESTATTRSTRINGTOBITFAILED
; goto cleanup; } } while (0)
862 PKIX_LDAPREQUESTATTRSTRINGTOBITFAILED)do { stdVars.aPkixErrorResult = (pkix_pl_LdapRequest_AttrStringToBit
(attr, &attrBit, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LDAPREQUESTATTRSTRINGTOBITFAILED
; goto cleanup; } } while (0)
;
863 request->attributes |= attrBit;
864 attr = *(++attrArray);
865 }
866
867cleanup:
868
869 PKIX_PL_Free(locationAscii, plContext);
870 PKIX_DECREF(locationString)do { if (locationString){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(locationString), plContext); if (stdVars
.aPkixTempResult) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult
, plContext); stdVars.aPkixTempResult = ((void*)0); } locationString
= ((void*)0); } } while (0)
;
871
872 PKIX_RETURN(INFOACCESS)return PKIX_DoReturn(&stdVars, (PKIX_INFOACCESS_ERROR), (
(PKIX_Boolean) 1), plContext);
;
873}
874#endif /* !NSS_PKIX_NO_LDAP */