tpm2-tss 3.2.1
TPM Software stack 2.0 TCG spec compliant implementation
ifapi_macros.h
1/* SPDX-License-Identifier: BSD-2-Clause */
2/*******************************************************************************
3 * Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
4 * All rights reserved.
5 *******************************************************************************/
6#ifndef IFAPI_MACROS_H
7#define IFAPI_MACROS_H
8
9#define strdup_check(dest, str, r, label) \
10 if (str) { \
11 dest = strdup(str); \
12 if (!dest) { \
13 r = TSS2_FAPI_RC_MEMORY; \
14 LOG_ERROR("Out of memory."); \
15 goto label; \
16 } \
17 } else { \
18 dest = NULL; \
19 }
20
21#define calloc_check(dest, size, r, label) \
22 { \
23 dest = callock(size,1); \
24 if (!dest) { \
25 r = TSS2_FAPI_RC_MEMORY; \
26 LOG_ERROR("Out of memory."); \
27 goto label; \
28 } \
29 }
30
31#define goto_if_null2(p,msg, r, ec, label, ...) \
32 if ((p) == NULL) { \
33 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(ec), ## __VA_ARGS__); \
34 r = (ec); \
35 goto label; \
36 }
37
38#define goto_if_error2(r,msg,label, ...) \
39 if (r != TSS2_RC_SUCCESS) { \
40 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
41 goto label; \
42 }
43
44#define return_if_error2(r,msg, ...) \
45 if (r != TSS2_RC_SUCCESS) { \
46 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
47 return r; \
48 }
49
50#define try_again_or_error(r,msg, ...) \
51 if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) \
52 return TSS2_FAPI_RC_TRY_AGAIN; \
53 if (r != TSS2_RC_SUCCESS) { \
54 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
55 return r; \
56 }
57
58#define try_again_or_error_goto(r,msg, label, ...) \
59 if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) \
60 return TSS2_FAPI_RC_TRY_AGAIN; \
61 if (r != TSS2_RC_SUCCESS) { \
62 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
63 goto label; \
64 }
65
66#define return_error2(r,msg, ...) { \
67 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
68 return (r); }
69
70
71#define return_if_error_reset_state(r,msg, ...) \
72 if (r != TSS2_RC_SUCCESS) { \
73 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
74 context->state = _FAPI_STATE_INIT; \
75 return r; \
76 }
77
78#define goto_if_error_reset_state(r,msg,label, ...) \
79 if (r != TSS2_RC_SUCCESS) { \
80 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
81 context->state = _FAPI_STATE_INIT; \
82 goto label; \
83 }
84
85#define goto_error_reset_state(r,v,msg,label) { \
86 r = v; \
87 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
88 context->state = _FAPI_STATE_INIT; \
89 goto label; }
90
91#define goto_if_null_reset_state(p,msg,r,ec,label) \
92 if ((p) == NULL) { \
93 LOG_ERROR("%s ", (msg)); \
94 context->state = _FAPI_STATE_INIT; \
95 (r) = (ec); \
96 goto label; \
97 }
98
99#define return_try_again(r) \
100 if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) { \
101 LOG_TRACE("Received TRY_AGAIN; returning TRY_AGAIN"); \
102 return TSS2_FAPI_RC_TRY_AGAIN; \
103 }
104
105#define check_not_null(X) \
106 if (X == NULL) { \
107 LOG_ERROR(str(X) " is NULL: BAD_REFERENCE"); \
108 return TSS2_FAPI_RC_BAD_REFERENCE; \
109 }
110
111#define check_oom(X) \
112 if (X == NULL) { \
113 LOG_ERROR("Out of memory"); \
114 return TSS2_FAPI_RC_MEMORY; \
115 }
116
117#if defined __GNUC__ && __GNUC__ < 7
118#define fallthrough { }
119#else
120#define fallthrough __attribute__((fallthrough))
121#endif
122
123#define statecase(VAR, STATE) \
124 case STATE: \
125 LOG_TRACE("State " str(VAR) " reached " str(STATE)); \
126 VAR=STATE;
127
128#define general_failure(VAR) \
129 default: \
130 LOG_ERROR("Bad state for " str(VAR)); \
131 return TSS2_FAPI_RC_GENERAL_FAILURE;
132
133#define statecasedefault(VAR) \
134 default: \
135 LOG_ERROR("Bad state for " str(VAR)); \
136 return TSS2_FAPI_RC_BAD_SEQUENCE;
137
138#define statecasedefault_error(VAR, r, label) \
139 default: \
140 LOG_ERROR("Bad state for " str(VAR)); \
141 r = TSS2_FAPI_RC_BAD_SEQUENCE; \
142 goto label;
143
144#endif /* IFAPI_MACROS_H */