tpm2-tss  3.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 #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 */