tpm2-tss 4.2.0
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#include <string.h> // IWYU pragma: keep
10
11#define strdup_check(dest, str, r, label) \
12 if (str) { \
13 (dest) = strdup(str); \
14 if (!(dest)) { \
15 (r) = TSS2_FAPI_RC_MEMORY; \
16 LOG_ERROR("Out of memory."); \
17 goto label; \
18 } \
19 } else { \
20 (dest) = NULL; \
21 }
22
23#define calloc_check(dest, size, r, label) \
24 { \
25 (dest) = callock(size, 1); \
26 if (!(dest)) { \
27 (r) = TSS2_FAPI_RC_MEMORY; \
28 LOG_ERROR("Out of memory."); \
29 goto label; \
30 } \
31 }
32
33#define goto_if_null2(p, msg, r, ec, label, ...) \
34 if ((p) == NULL) { \
35 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(ec), ##__VA_ARGS__); \
36 r = (ec); \
37 goto label; \
38 }
39
40#define goto_if_error2(r, msg, label, ...) \
41 if (r != TSS2_RC_SUCCESS) { \
42 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ##__VA_ARGS__); \
43 goto label; \
44 }
45
46#define return_if_error2(r, msg, ...) \
47 if (r != TSS2_RC_SUCCESS) { \
48 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ##__VA_ARGS__); \
49 return r; \
50 }
51
52#define try_again_or_error(r, msg, ...) \
53 if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) \
54 return TSS2_FAPI_RC_TRY_AGAIN; \
55 if (r != TSS2_RC_SUCCESS) { \
56 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ##__VA_ARGS__); \
57 return r; \
58 }
59
60#define try_again_or_error_goto(r, msg, label, ...) \
61 if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) \
62 return TSS2_FAPI_RC_TRY_AGAIN; \
63 if (r != TSS2_RC_SUCCESS) { \
64 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ##__VA_ARGS__); \
65 goto label; \
66 }
67
68#define return_error2(r, msg, ...) \
69 { \
70 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ##__VA_ARGS__); \
71 return (r); \
72 }
73
74#define return_if_error_reset_state(r, msg, ...) \
75 if (r != TSS2_RC_SUCCESS) { \
76 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ##__VA_ARGS__); \
77 context->state = FAPI_STATE_INIT; \
78 return r; \
79 }
80
81#define goto_if_error_reset_state(r, msg, label, ...) \
82 if (r != TSS2_RC_SUCCESS) { \
83 LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ##__VA_ARGS__); \
84 context->state = FAPI_STATE_INIT; \
85 goto label; \
86 }
87
88#define goto_error_reset_state(r, v, msg, label) \
89 { \
90 (r) = v; \
91 LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
92 context->state = FAPI_STATE_INIT; \
93 goto label; \
94 }
95
96#define goto_if_null_reset_state(p, msg, r, ec, label) \
97 if ((p) == NULL) { \
98 LOG_ERROR("%s ", (msg)); \
99 context->state = FAPI_STATE_INIT; \
100 (r) = (ec); \
101 goto label; \
102 }
103
104#define return_try_again(r) \
105 if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) { \
106 LOG_TRACE("Received TRY_AGAIN; returning TRY_AGAIN"); \
107 return TSS2_FAPI_RC_TRY_AGAIN; \
108 }
109
110#define check_not_null(X) \
111 if ((X) == NULL) { \
112 LOG_ERROR(str(X) " is NULL: BAD_REFERENCE"); \
113 return TSS2_FAPI_RC_BAD_REFERENCE; \
114 }
115
116#define check_in_bounds(X, upper) \
117 { \
118 const size_t _size = (X); \
119 const size_t _upper = (upper); \
120 if (_size > _upper) { \
121 LOG_ERROR(str(X) " is larger than %zi", _upper); \
122 return TSS2_FAPI_RC_BAD_VALUE; \
123 } \
124 }
125
126#define check_oom(X) \
127 if ((X) == NULL) { \
128 LOG_ERROR("Out of memory"); \
129 return TSS2_FAPI_RC_MEMORY; \
130 }
131
132#if defined __GNUC__ && __GNUC__ < 7
133#define fallthrough \
134 {}
135#else
136#define fallthrough __attribute__((fallthrough))
137#endif
138
139#define statecase(VAR, STATE) \
140 case STATE: \
141 LOG_TRACE("State " str(VAR) " reached " str(STATE)); \
142 (VAR) = STATE;
143
144#define general_failure(VAR) \
145 default: \
146 LOG_ERROR("Bad state for " str(VAR)); \
147 return TSS2_FAPI_RC_GENERAL_FAILURE;
148
149#define statecasedefault(VAR) \
150 default: \
151 LOG_ERROR("Bad state for " str(VAR) ": %i", VAR); \
152 return TSS2_FAPI_RC_BAD_SEQUENCE;
153
154#define statecasedefault_error(VAR, r, label) \
155 default: \
156 LOG_ERROR("Bad state for " str(VAR) ": %i", VAR); \
157 (r) = TSS2_FAPI_RC_BAD_SEQUENCE; \
158 goto label;
159
160#endif /* IFAPI_MACROS_H */