Bug Summary

File:s/lib/libpkix/pkix_pl_nss/system/pkix_pl_oid.c
Warning:line 119, column 31
The left operand of '==' is a garbage value

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_oid.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/system -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/var/lib/jenkins/workspace/nss-scan-build/nss/lib/libpkix/pkix_pl_nss/system -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_oid.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_oid.c
6 *
7 * OID Object Functions
8 *
9 */
10
11#include "pkix_pl_oid.h"
12
13/* --Private-OID-Functions---------------------------------------- */
14
15 /*
16 * FUNCTION: pkix_pl_OID_Comparator
17 * (see comments for PKIX_PL_ComparatorCallback in pkix_pl_system.h)
18 */
19static PKIX_Error *
20pkix_pl_OID_Comparator(
21 PKIX_PL_Object *firstObject,
22 PKIX_PL_Object *secondObject,
23 PKIX_Int32 *pRes,
24 void *plContext)
25{
26 PKIX_PL_OID *firstOID = NULL((void*)0);
27 PKIX_PL_OID *secondOID = NULL((void*)0);
28
29 PKIX_ENTER(OID, "pkix_pl_OID_Comparator")static const char cMyFuncName[] = {"pkix_pl_OID_Comparator"};
PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
11
Taking false branch
30 PKIX_NULLCHECK_THREE(firstObject, secondObject, pRes)do { if (((firstObject) == ((void*)0)) || ((secondObject) == (
(void*)0)) || ((pRes) == ((void*)0))){ stdVars.aPkixErrorReceived
= ((PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NULLARGUMENT
; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean
) 1), plContext);; } } while (0)
;
12
Loop condition is false. Exiting loop
13
Taking false branch
14
Loop condition is false. Exiting loop
31
32 PKIX_CHECK(pkix_CheckTypesdo { stdVars.aPkixErrorResult = (pkix_CheckTypes (firstObject
, secondObject, PKIX_OID_TYPE, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_ARGUMENTSNOTOIDS; goto cleanup
; } } while (0)
15
Assuming field 'aPkixErrorResult' is non-null
16
Taking true branch
17
Control jumps to line 42
33 (firstObject, secondObject, PKIX_OID_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckTypes (firstObject
, secondObject, PKIX_OID_TYPE, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_ARGUMENTSNOTOIDS; goto cleanup
; } } while (0)
34 PKIX_ARGUMENTSNOTOIDS)do { stdVars.aPkixErrorResult = (pkix_CheckTypes (firstObject
, secondObject, PKIX_OID_TYPE, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_ARGUMENTSNOTOIDS; goto cleanup
; } } while (0)
;
35
36 firstOID = (PKIX_PL_OID*)firstObject;
37 secondOID = (PKIX_PL_OID*)secondObject;
38
39 *pRes = (PKIX_Int32)SECITEM_CompareItemSECITEM_CompareItem_Util(&firstOID->derOid,
40 &secondOID->derOid);
41cleanup:
42 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
18
Returning without writing to '*pRes'
19
Returning pointer, which participates in a condition later
43}
44
45/*
46 * FUNCTION: pkix_pl_OID_Destroy
47 * (see comments for PKIX_PL_DestructorCallback in pkix_pl_system.h)
48 */
49static PKIX_Error *
50pkix_pl_OID_Destroy(
51 PKIX_PL_Object *object,
52 void *plContext)
53{
54 PKIX_PL_OID *oid = NULL((void*)0);
55
56 PKIX_ENTER(OID, "pkix_pl_OID_Destroy")static const char cMyFuncName[] = {"pkix_pl_OID_Destroy"}; PKIX_StdVars
stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName; stdVars
.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
57 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)
;
58
59 PKIX_CHECK(pkix_CheckType(object, PKIX_OID_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_OID_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANOID; goto cleanup; } } while (0)
60 PKIX_OBJECTNOTANOID)do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_OID_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANOID; goto cleanup; } } while (0)
;
61 oid = (PKIX_PL_OID*)object;
62 SECITEM_FreeItemSECITEM_FreeItem_Util(&oid->derOid, PR_FALSE0);
63
64cleanup:
65 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
66}
67
68/*
69 * FUNCTION: pkix_pl_OID_Hashcode
70 * (see comments for PKIX_PL_HashcodeCallback in pkix_pl_system.h)
71 */
72static PKIX_Error *
73pkix_pl_OID_Hashcode(
74 PKIX_PL_Object *object,
75 PKIX_UInt32 *pHashcode,
76 void *plContext)
77{
78 PKIX_PL_OID *oid = NULL((void*)0);
79
80 PKIX_ENTER(OID, "pkix_pl_OID_HashCode")static const char cMyFuncName[] = {"pkix_pl_OID_HashCode"}; PKIX_StdVars
stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName; stdVars
.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
81 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)
;
82
83 PKIX_CHECK(pkix_CheckType(object, PKIX_OID_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_OID_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANOID; goto cleanup; } } while (0)
84 PKIX_OBJECTNOTANOID)do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_OID_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANOID; goto cleanup; } } while (0)
;
85
86 oid = (PKIX_PL_OID *)object;
87
88 PKIX_CHECK(pkix_hashdo { stdVars.aPkixErrorResult = (pkix_hash ((unsigned char *)
oid->derOid.data, oid->derOid.len * sizeof (char), pHashcode
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_HASHFAILED; goto cleanup; } } while (0)
89 ((unsigned char *)oid->derOid.data,do { stdVars.aPkixErrorResult = (pkix_hash ((unsigned char *)
oid->derOid.data, oid->derOid.len * sizeof (char), pHashcode
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_HASHFAILED; goto cleanup; } } while (0)
90 oid->derOid.len * sizeof (char),do { stdVars.aPkixErrorResult = (pkix_hash ((unsigned char *)
oid->derOid.data, oid->derOid.len * sizeof (char), pHashcode
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_HASHFAILED; goto cleanup; } } while (0)
91 pHashcode,do { stdVars.aPkixErrorResult = (pkix_hash ((unsigned char *)
oid->derOid.data, oid->derOid.len * sizeof (char), pHashcode
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_HASHFAILED; goto cleanup; } } while (0)
92 plContext),do { stdVars.aPkixErrorResult = (pkix_hash ((unsigned char *)
oid->derOid.data, oid->derOid.len * sizeof (char), pHashcode
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_HASHFAILED; goto cleanup; } } while (0)
93 PKIX_HASHFAILED)do { stdVars.aPkixErrorResult = (pkix_hash ((unsigned char *)
oid->derOid.data, oid->derOid.len * sizeof (char), pHashcode
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_HASHFAILED; goto cleanup; } } while (0)
;
94cleanup:
95
96 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
97}
98
99/*
100 * FUNCTION: pkix_pl_OID_Equals
101 * (see comments for PKIX_PL_EqualsCallback in pkix_pl_system.h)
102 */
103static PKIX_Error *
104pkix_pl_OID_Equals(
105 PKIX_PL_Object *first,
106 PKIX_PL_Object *second,
107 PKIX_Boolean *pResult,
108 void *plContext)
109{
110 PKIX_Int32 cmpResult;
1
'cmpResult' declared without an initial value
111
112 PKIX_ENTER(OID, "pkix_pl_OID_Equals")static const char cMyFuncName[] = {"pkix_pl_OID_Equals"}; PKIX_StdVars
stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName; stdVars
.aPkixType = PKIX_OID_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
113 PKIX_NULLCHECK_THREE(first, second, pResult)do { if (((first) == ((void*)0)) || ((second) == ((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)
;
4
Loop condition is false. Exiting loop
5
Assuming 'first' is not equal to null
6
Assuming 'second' is not equal to null
7
Assuming 'pResult' is not equal to null
8
Taking false branch
9
Loop condition is false. Exiting loop
114
115 PKIX_CHECK(pkix_pl_OID_Comparatordo { stdVars.aPkixErrorResult = (pkix_pl_OID_Comparator (first
, second, &cmpResult, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_OIDCOMPARATORFAILED; goto cleanup
; } } while (0)
10
Calling 'pkix_pl_OID_Comparator'
20
Returning from 'pkix_pl_OID_Comparator'
21
Assuming field 'aPkixErrorResult' is null
22
Taking false branch
23
Loop condition is false. Exiting loop
116 (first, second, &cmpResult, plContext),do { stdVars.aPkixErrorResult = (pkix_pl_OID_Comparator (first
, second, &cmpResult, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_OIDCOMPARATORFAILED; goto cleanup
; } } while (0)
117 PKIX_OIDCOMPARATORFAILED)do { stdVars.aPkixErrorResult = (pkix_pl_OID_Comparator (first
, second, &cmpResult, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_OIDCOMPARATORFAILED; goto cleanup
; } } while (0)
;
118
119 *pResult = (cmpResult == 0);
24
The left operand of '==' is a garbage value
120cleanup:
121
122 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
123}
124
125/*
126 * FUNCTION: pkix_pl_OID_ToString
127 * (see comments for PKIX_PL_ToStringCallback in pkix_pl_system.h)
128 * Use this function only for printing OIDs and not to make any
129 * critical security decision.
130 */
131static PKIX_Error *
132pkix_pl_OID_ToString(
133 PKIX_PL_Object *object,
134 PKIX_PL_String **pString,
135 void *plContext)
136{
137 PKIX_PL_OID *oid = NULL((void*)0);
138 char *oidString = NULL((void*)0);
139
140 PKIX_ENTER(OID, "pkix_pl_OID_toString")static const char cMyFuncName[] = {"pkix_pl_OID_toString"}; PKIX_StdVars
stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName; stdVars
.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
141 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)
;
142
143 PKIX_CHECK(pkix_CheckType(object, PKIX_OID_TYPE, plContext),do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_OID_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANOID; goto cleanup; } } while (0)
144 PKIX_OBJECTNOTANOID)do { stdVars.aPkixErrorResult = (pkix_CheckType(object, PKIX_OID_TYPE
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_OBJECTNOTANOID; goto cleanup; } } while (0)
;
145 oid = (PKIX_PL_OID*)object;
146 oidString = CERT_GetOidString(&oid->derOid);
147
148 PKIX_CHECK(PKIX_PL_String_Createdo { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, oidString
, 0, pString, plContext)); if (stdVars.aPkixErrorResult) { stdVars
.aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup; } } while
(0)
149 (PKIX_ESCASCII, oidString , 0, pString, plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, oidString
, 0, pString, plContext)); if (stdVars.aPkixErrorResult) { stdVars
.aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup; } } while
(0)
150 PKIX_STRINGCREATEFAILED)do { stdVars.aPkixErrorResult = (PKIX_PL_String_Create (0, oidString
, 0, pString, plContext)); if (stdVars.aPkixErrorResult) { stdVars
.aPkixErrorClass = stdVars.aPkixErrorResult->errClass; stdVars
.aPkixErrorCode = PKIX_STRINGCREATEFAILED; goto cleanup; } } while
(0)
;
151cleanup:
152 PR_smprintf_free(oidString);
153
154 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
155}
156
157/*
158 * FUNCTION: pkix_pl_OID_RegisterSelf
159 * DESCRIPTION:
160 * Registers PKIX_OID_TYPE and its related functions with systemClasses[]
161 * THREAD SAFETY:
162 * Not Thread Safe - for performance and complexity reasons
163 *
164 * Since this function is only called by PKIX_PL_Initialize, which should
165 * only be called once, it is acceptable that this function is not
166 * thread-safe.
167 */
168PKIX_Error *
169pkix_pl_OID_RegisterSelf(
170 void *plContext)
171{
172 extern pkix_ClassTable_Entry systemClasses[PKIX_NUMTYPES];
173 pkix_ClassTable_Entry *entry = &systemClasses[PKIX_OID_TYPE];
174
175 PKIX_ENTER(OID, "pkix_pl_OID_RegisterSelf")static const char cMyFuncName[] = {"pkix_pl_OID_RegisterSelf"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
176
177 entry->description = "OID";
178 entry->typeObjectSize = sizeof(PKIX_PL_OID);
179 entry->destructor = pkix_pl_OID_Destroy;
180 entry->equalsFunction = pkix_pl_OID_Equals;
181 entry->hashcodeFunction = pkix_pl_OID_Hashcode;
182 entry->toStringFunction = pkix_pl_OID_ToString;
183 entry->comparator = pkix_pl_OID_Comparator;
184 entry->duplicateFunction = pkix_duplicateImmutable;
185
186 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
187}
188
189/*
190 * FUNCTION: pkix_pl_OID_GetCriticalExtensionOIDs
191 * DESCRIPTION:
192 *
193 * Converts the extensions in "extensions" array that are critical to
194 * PKIX_PL_OID and returns the result as a PKIX_List in "pPidList".
195 * If there is no critical extension, an empty list is returned.
196 *
197 * PARAMETERS
198 * "extension"
199 * an array of extension pointers. May be NULL.
200 * "pOidsList"
201 * Address where the list of OIDs is returned. Must be non-NULL.
202 * THREAD SAFETY:
203 * Thread Safe (see Thread Safety Definitions in Programmer's Guide)
204 * RETURNS:
205 * Returns NULL if the function succeeds.
206 * Returns a CRL Error if the function fails in a non-fatal way.
207 * Returns a Fatal Error if the function fails in an unrecoverable way.
208 */
209PKIX_Error *
210pkix_pl_OID_GetCriticalExtensionOIDs(
211 CERTCertExtension **extensions,
212 PKIX_List **pOidsList,
213 void *plContext)
214{
215 PKIX_List *oidsList = NULL((void*)0);
216 PKIX_PL_OID *pkixOID = NULL((void*)0);
217
218 PKIX_ENTER(OID, "pkix_pl_OID_GetCriticalExtensionOIDs")static const char cMyFuncName[] = {"pkix_pl_OID_GetCriticalExtensionOIDs"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
219 PKIX_NULLCHECK_ONE(pOidsList)do { if ((pOidsList) == ((void*)0)){ stdVars.aPkixErrorReceived
= ((PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NULLARGUMENT
; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean
) 1), plContext);; } } while (0)
;
220
221 PKIX_CHECK(PKIX_List_Create(&oidsList, plContext),do { stdVars.aPkixErrorResult = (PKIX_List_Create(&oidsList
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_LISTCREATEFAILED; goto cleanup; } } while (0)
222 PKIX_LISTCREATEFAILED)do { stdVars.aPkixErrorResult = (PKIX_List_Create(&oidsList
, plContext)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass
= stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_LISTCREATEFAILED; goto cleanup; } } while (0)
;
223
224 if (extensions) {
225 while (*extensions) {
226 CERTCertExtension *extension = NULL((void*)0);
227 SECItem *critical = NULL((void*)0);
228 SECItem *oid = NULL((void*)0);
229
230 extension = *extensions++;
231 /* extension is critical ? */
232 critical = &extension->critical;
233 if (critical->len == 0 || critical->data[0] == 0) {
234 continue;
235 }
236 oid = &extension->id;
237 PKIX_CHECK(do { stdVars.aPkixErrorResult = (PKIX_PL_OID_CreateBySECItem(
oid, &pkixOID, plContext)); if (stdVars.aPkixErrorResult)
{ stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_OIDCREATEFAILED; goto cleanup
; } } while (0)
238 PKIX_PL_OID_CreateBySECItem(oid, &pkixOID, plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_OID_CreateBySECItem(
oid, &pkixOID, plContext)); if (stdVars.aPkixErrorResult)
{ stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_OIDCREATEFAILED; goto cleanup
; } } while (0)
239 PKIX_OIDCREATEFAILED)do { stdVars.aPkixErrorResult = (PKIX_PL_OID_CreateBySECItem(
oid, &pkixOID, plContext)); if (stdVars.aPkixErrorResult)
{ stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_OIDCREATEFAILED; goto cleanup
; } } while (0)
;
240 PKIX_CHECK(do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem(oidsList
, (PKIX_PL_Object *)pkixOID, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
241 PKIX_List_AppendItem(oidsList, (PKIX_PL_Object *)pkixOID,do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem(oidsList
, (PKIX_PL_Object *)pkixOID, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
242 plContext),do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem(oidsList
, (PKIX_PL_Object *)pkixOID, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
243 PKIX_LISTAPPENDITEMFAILED)do { stdVars.aPkixErrorResult = (PKIX_List_AppendItem(oidsList
, (PKIX_PL_Object *)pkixOID, plContext)); if (stdVars.aPkixErrorResult
) { stdVars.aPkixErrorClass = stdVars.aPkixErrorResult->errClass
; stdVars.aPkixErrorCode = PKIX_LISTAPPENDITEMFAILED; goto cleanup
; } } while (0)
;
244 PKIX_DECREF(pkixOID)do { if (pkixOID){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(pkixOID), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } pkixOID = ((void*)
0); } } while (0)
;
245 }
246 }
247
248 *pOidsList = oidsList;
249 oidsList = NULL((void*)0);
250
251cleanup:
252 PKIX_DECREF(oidsList)do { if (oidsList){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(oidsList), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } oidsList = ((void*
)0); } } while (0)
;
253 PKIX_DECREF(pkixOID)do { if (pkixOID){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(pkixOID), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } pkixOID = ((void*)
0); } } while (0)
;
254 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
255}
256
257/* --Public-Functions------------------------------------------------------- */
258
259/*
260 * FUNCTION: PKIX_PL_OID_CreateBySECItem (see comments in pkix_pl_system.h)
261 */
262PKIX_Error *
263PKIX_PL_OID_CreateBySECItem(
264 SECItem *derOid,
265 PKIX_PL_OID **pOID,
266 void *plContext)
267{
268 PKIX_PL_OID *oid = NULL((void*)0);
269 SECStatus rv;
270
271 PKIX_ENTER(OID, "PKIX_PL_OID_CreateBySECItem")static const char cMyFuncName[] = {"PKIX_PL_OID_CreateBySECItem"
}; PKIX_StdVars stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName
; stdVars.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
272 PKIX_NULLCHECK_TWO(pOID, derOid)do { if (((pOID) == ((void*)0)) || ((derOid) == ((void*)0))){
stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars.aPkixErrorCode
= PKIX_NULLARGUMENT; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR
), ((PKIX_Boolean) 1), plContext);; } } while (0)
;
273
274 PKIX_CHECK(PKIX_PL_Object_Allocdo { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_OID_TYPE
, sizeof (PKIX_PL_OID), (PKIX_PL_Object **)&oid, plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEOBJECT; goto cleanup; } } while (0)
275 (PKIX_OID_TYPE,do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_OID_TYPE
, sizeof (PKIX_PL_OID), (PKIX_PL_Object **)&oid, plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEOBJECT; goto cleanup; } } while (0)
276 sizeof (PKIX_PL_OID),do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_OID_TYPE
, sizeof (PKIX_PL_OID), (PKIX_PL_Object **)&oid, plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEOBJECT; goto cleanup; } } while (0)
277 (PKIX_PL_Object **)&oid,do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_OID_TYPE
, sizeof (PKIX_PL_OID), (PKIX_PL_Object **)&oid, plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEOBJECT; goto cleanup; } } while (0)
278 plContext),do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_OID_TYPE
, sizeof (PKIX_PL_OID), (PKIX_PL_Object **)&oid, plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEOBJECT; goto cleanup; } } while (0)
279 PKIX_COULDNOTCREATEOBJECT)do { stdVars.aPkixErrorResult = (PKIX_PL_Object_Alloc (PKIX_OID_TYPE
, sizeof (PKIX_PL_OID), (PKIX_PL_Object **)&oid, plContext
)); if (stdVars.aPkixErrorResult) { stdVars.aPkixErrorClass =
stdVars.aPkixErrorResult->errClass; stdVars.aPkixErrorCode
= PKIX_COULDNOTCREATEOBJECT; goto cleanup; } } while (0)
;
280 rv = SECITEM_CopyItemSECITEM_CopyItem_Util(NULL((void*)0), &oid->derOid, derOid);
281 if (rv != SECSuccess) {
282 PKIX_ERROR(PKIX_OUTOFMEMORY){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_OUTOFMEMORY, ((void*)0), stdVars.aPkixType, 2, plContext
); } } stdVars.aPkixErrorReceived = ((PKIX_Boolean) 1); stdVars
.aPkixErrorCode = PKIX_OUTOFMEMORY; goto cleanup; }
;
283 }
284 *pOID = oid;
285 oid = NULL((void*)0);
286
287cleanup:
288 PKIX_DECREF(oid)do { if (oid){ stdVars.aPkixTempResult = PKIX_PL_Object_DecRef
((PKIX_PL_Object *)(oid), plContext); if (stdVars.aPkixTempResult
) { PKIX_DoAddError(&stdVars, stdVars.aPkixTempResult, plContext
); stdVars.aPkixTempResult = ((void*)0); } oid = ((void*)0); }
} while (0)
;
289
290 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
291}
292
293/*
294 * FUNCTION: PKIX_PL_OID_Create (see comments in pkix_pl_system.h)
295 */
296PKIX_Error *
297PKIX_PL_OID_Create(
298 SECOidTag idtag,
299 PKIX_PL_OID **pOID,
300 void *plContext)
301{
302 SECOidData *oidData = NULL((void*)0);
303
304 PKIX_ENTER(OID, "PKIX_PL_OID_Create")static const char cMyFuncName[] = {"PKIX_PL_OID_Create"}; PKIX_StdVars
stdVars = zeroStdVars; stdVars.aMyFuncName = cMyFuncName; stdVars
.aPkixType = PKIX_OID_ERROR; ; do { if (pkixLoggersDebugTrace
) { pkix_Logger_Check(pkixLoggersDebugTrace, stdVars.aMyFuncName
, ">>>", stdVars.aPkixType, 5, plContext); } } while
(0);
;
305 PKIX_NULLCHECK_ONE(pOID)do { if ((pOID) == ((void*)0)){ stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_NULLARGUMENT
; return PKIX_DoReturn(&stdVars, (PKIX_FATAL_ERROR), ((PKIX_Boolean
) 1), plContext);; } } while (0)
;
306
307 oidData = SECOID_FindOIDByTagSECOID_FindOIDByTag_Util((SECOidTag)idtag);
308 if (!oidData) {
309 PKIX_ERROR(PKIX_SECOIDFINDOIDTAGDESCRIPTIONFAILED){ { if (pkixLoggersErrors) { pkix_Logger_CheckWithCode(pkixLoggersErrors
, PKIX_SECOIDFINDOIDTAGDESCRIPTIONFAILED, ((void*)0), stdVars
.aPkixType, 2, plContext); } } stdVars.aPkixErrorReceived = (
(PKIX_Boolean) 1); stdVars.aPkixErrorCode = PKIX_SECOIDFINDOIDTAGDESCRIPTIONFAILED
; goto cleanup; }
;
310 }
311
312 pkixErrorResultstdVars.aPkixErrorResult =
313 PKIX_PL_OID_CreateBySECItem(&oidData->oid, pOID, plContext);
314cleanup:
315 PKIX_RETURN(OID)return PKIX_DoReturn(&stdVars, (PKIX_OID_ERROR), ((PKIX_Boolean
) 1), plContext);
;
316}