2 * Copyright (c) 2000-2004,2006,2011,2013-2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
28 #include <security_cdsa_utilities/cssmerrors.h>
29 #include <security_utilities/mach++.h>
30 #include <Security/cssmapple.h>
31 #include <Security/SecBase.h>
32 #include <Security/SecBasePriv.h>
37 CssmError::CssmError(CSSM_RETURN err
, bool suppresslogging
) : error(err
)
39 SECURITY_EXCEPTION_THROW_CSSM(this, err
);
41 if(!suppresslogging
|| secinfoenabled("security_exception")) {
42 snprintf(whatBuffer
, whatBufferSize
, "CSSM Exception: %d %s", err
, cssmErrorString(err
));
44 /* reduce log noise by filtering out some non-error exceptions */
45 case CSSMERR_CL_UNKNOWN_TAG
:
48 secnotice("security_exception", "%s", what());
56 const char *CssmError::what() const throw ()
62 OSStatus
CssmError::osStatus() const
64 if (error
== CSSM_ERRCODE_INVALID_POINTER
)
73 int CssmError::unixError() const
75 OSStatus err
= osStatus();
77 // embedded UNIX errno values are returned verbatim
78 if (err
>= errSecErrnoBase
&& err
<= errSecErrnoLimit
)
79 return err
- errSecErrnoBase
;
81 // re-map certain CSSM errors
83 case CSSM_ERRCODE_MEMORY_ERROR
:
85 case CSSMERR_APPLEDL_DISK_FULL
:
87 case CSSMERR_APPLEDL_QUOTA_EXCEEDED
:
89 case CSSMERR_APPLEDL_FILE_TOO_BIG
:
92 // cannot map this to errno space
98 void CssmError::throwMe(CSSM_RETURN err
)
100 throw CssmError(err
, false);
103 void CssmError::throwMeNoLogging(CSSM_RETURN err
)
105 throw CssmError(err
, true);
109 CSSM_RETURN
CssmError::merge(CSSM_RETURN error
, CSSM_RETURN base
)
111 if (0 < error
&& error
< CSSM_ERRORCODE_COMMON_EXTENT
) {
119 // Get a CSSM_RETURN from a CommonError
121 CSSM_RETURN
CssmError::cssmError(const CommonError
&error
, CSSM_RETURN base
)
123 if (const CssmError
*cssm
= dynamic_cast<const CssmError
*>(&error
)) {
124 return cssmError(cssm
->error
, base
);
125 } else if (const MachPlusPlus::Error
*mach
= dynamic_cast<const MachPlusPlus::Error
*>(&error
)) {
126 switch (mach
->error
) {
127 case BOOTSTRAP_UNKNOWN_SERVICE
:
128 case MIG_SERVER_DIED
:
129 return CSSM_ERRCODE_SERVICE_NOT_AVAILABLE
;
131 return CSSM_ERRCODE_INTERNAL_ERROR
;
134 return error
.osStatus();
138 CSSM_RETURN
CssmError::cssmError(CSSM_RETURN error
, CSSM_RETURN base
)
140 if (0 < error
&& error
< CSSM_ERRORCODE_COMMON_EXTENT
) {
148 } // namespace Security