master hovercats/oakiss / pkg / libnl / patch / 0005-Remove-_nl_auto-helpers.patch
  1From 558f898c413bd46423c6b07073422fc6fc18769c Mon Sep 17 00:00:00 2001
  2From: Michael Forney <mforney@mforney.org>
  3Date: Fri, 4 Oct 2019 18:13:36 -0700
  4Subject: [PATCH] Remove _nl_auto helpers
  5
  6These use non-standard __attribute__((cleanup)) and statement
  7expressions.
  8---
  9 include/netlink-private/utils.h | 49 ---------------------------------
 10 lib/genl/mngt.c                 | 10 +++++--
 11 lib/xfrm/sa.c                   | 24 ++++++++--------
 12 3 files changed, 19 insertions(+), 64 deletions(-)
 13
 14diff --git a/include/netlink-private/utils.h b/include/netlink-private/utils.h
 15index f33a2f8..1456797 100644
 16--- a/include/netlink-private/utils.h
 17+++ b/include/netlink-private/utils.h
 18@@ -67,7 +67,6 @@
 19 /*****************************************************************************/
 20 
 21 #define _nl_unused                  __attribute__ ((__unused__))
 22-#define _nl_auto(fcn)               __attribute__ ((__cleanup__(fcn)))
 23 
 24 /*****************************************************************************/
 25 
 26@@ -83,18 +82,6 @@
 27 
 28 /*****************************************************************************/
 29 
 30-#define _NL_AUTO_DEFINE_FCN_VOID0(CastType, name, func) \
 31-static inline void name (void *v) \
 32-{ \
 33-	if (*((CastType *) v)) \
 34-		func (*((CastType *) v)); \
 35-}
 36-
 37-#define _nl_auto_free _nl_auto(_nl_auto_free_fcn)
 38-_NL_AUTO_DEFINE_FCN_VOID0 (void *, _nl_auto_free_fcn, free)
 39-
 40-/*****************************************************************************/
 41-
 42 extern const char *nl_strerror_l(int err);
 43 
 44 /*****************************************************************************/
 45@@ -106,42 +93,6 @@ extern const char *nl_strerror_l(int err);
 46 
 47 /*****************************************************************************/
 48 
 49-#define _nl_clear_pointer(pp, destroy) \
 50-	({ \
 51-		__typeof__ (*(pp)) *_pp = (pp); \
 52-		__typeof__ (*_pp) _p; \
 53-		int _changed = 0; \
 54-		\
 55-		if (   _pp \
 56-			&& (_p = *_pp)) { \
 57-			_nl_unused const void *const _p_check_is_pointer = _p; \
 58-			\
 59-			*_pp = NULL; \
 60-			\
 61-			(destroy) (_p); \
 62-			\
 63-			_changed = 1; \
 64-		} \
 65-		_changed; \
 66-	})
 67-
 68-#define _nl_clear_free(pp) _nl_clear_pointer (pp, free)
 69-
 70-#define _nl_steal_pointer(pp) \
 71-	({ \
 72-		__typeof__ (*(pp)) *const _pp = (pp); \
 73-		__typeof__ (*_pp) _p = NULL; \
 74-		\
 75-		if (   _pp \
 76-		    && (_p = *_pp)) { \
 77-			*_pp = NULL; \
 78-		} \
 79-		\
 80-		_p; \
 81-	})
 82-
 83-/*****************************************************************************/
 84-
 85 #define _nl_malloc_maybe_a(alloca_maxlen, bytes, to_free) \
 86 	({ \
 87 		const size_t _bytes = (bytes); \
 88diff --git a/lib/genl/mngt.c b/lib/genl/mngt.c
 89index 28326cd..ff50e1d 100644
 90--- a/lib/genl/mngt.c
 91+++ b/lib/genl/mngt.c
 92@@ -50,7 +50,7 @@ static struct genl_cmd *lookup_cmd(struct genl_ops *ops, int cmd_id)
 93 static int cmd_msg_parser(struct sockaddr_nl *who, struct nlmsghdr *nlh,
 94                           struct genl_ops *ops, struct nl_cache_ops *cache_ops, void *arg)
 95 {
 96-	_nl_auto_free struct nlattr **tb_free = NULL;
 97+	struct nlattr **tb_free = NULL;
 98 	int err;
 99 	struct genlmsghdr *ghdr;
100 	struct genl_cmd *cmd;
101@@ -74,7 +74,7 @@ static int cmd_msg_parser(struct sockaddr_nl *who, struct nlmsghdr *nlh,
102 	                  cmd->c_maxattr,
103 	                  cmd->c_attr_policy);
104 	if (err < 0)
105-		return err;
106+		goto out;
107 
108 	{
109 		struct genl_info info = {
110@@ -85,8 +85,12 @@ static int cmd_msg_parser(struct sockaddr_nl *who, struct nlmsghdr *nlh,
111 			.attrs   = tb,
112 		};
113 
114-		return cmd->c_msg_parser(cache_ops, cmd, &info, arg);
115+		err = cmd->c_msg_parser(cache_ops, cmd, &info, arg);
116 	}
117+
118+out:
119+	free(tb_free);
120+	return err;
121 }
122 
123 static int genl_msg_parser(struct nl_cache_ops *ops, struct sockaddr_nl *who,
124diff --git a/lib/xfrm/sa.c b/lib/xfrm/sa.c
125index 48265ba..14bf298 100644
126--- a/lib/xfrm/sa.c
127+++ b/lib/xfrm/sa.c
128@@ -1683,7 +1683,7 @@ int xfrmnl_sa_get_aead_params (struct xfrmnl_sa* sa, char* alg_name, unsigned in
129 
130 int xfrmnl_sa_set_aead_params (struct xfrmnl_sa* sa, const char* alg_name, unsigned int key_len, unsigned int icv_len, const char* key)
131 {
132-	_nl_auto_free struct xfrmnl_algo_aead *b = NULL;
133+	struct xfrmnl_algo_aead *b = NULL;
134 	size_t keysize = sizeof (uint8_t) * ((key_len + 7)/8);
135 	uint32_t newlen = sizeof (struct xfrmnl_algo_aead) + keysize;
136 
137@@ -1699,7 +1699,7 @@ int xfrmnl_sa_set_aead_params (struct xfrmnl_sa* sa, const char* alg_name, unsig
138 	memcpy (b->alg_key, key, keysize);
139 
140 	free (sa->aead);
141-	sa->aead = _nl_steal_pointer (&b);
142+	sa->aead = b;
143 	sa->ce_mask |= XFRM_SA_ATTR_ALG_AEAD;
144 	return 0;
145 }
146@@ -1741,7 +1741,7 @@ int xfrmnl_sa_get_auth_params (struct xfrmnl_sa* sa, char* alg_name, unsigned in
147 
148 int xfrmnl_sa_set_auth_params (struct xfrmnl_sa* sa, const char* alg_name, unsigned int key_len, unsigned int trunc_len, const char* key)
149 {
150-	_nl_auto_free struct xfrmnl_algo_auth *b = NULL;
151+	struct xfrmnl_algo_auth *b = NULL;
152 	size_t keysize = sizeof (uint8_t) * ((key_len + 7)/8);
153 	uint32_t newlen = sizeof (struct xfrmnl_algo_auth) + keysize;
154 
155@@ -1756,7 +1756,7 @@ int xfrmnl_sa_set_auth_params (struct xfrmnl_sa* sa, const char* alg_name, unsig
156 	memcpy (b->alg_key, key, keysize);
157 
158 	free (sa->auth);
159-	sa->auth = _nl_steal_pointer (&b);
160+	sa->auth = b;
161 	sa->ce_mask |= XFRM_SA_ATTR_ALG_AUTH;
162 	return 0;
163 }
164@@ -1795,7 +1795,7 @@ int xfrmnl_sa_get_crypto_params (struct xfrmnl_sa* sa, char* alg_name, unsigned
165 
166 int xfrmnl_sa_set_crypto_params (struct xfrmnl_sa* sa, const char* alg_name, unsigned int key_len, const char* key)
167 {
168-	_nl_auto_free struct xfrmnl_algo *b = NULL;
169+	struct xfrmnl_algo *b = NULL;
170 	size_t keysize = sizeof (uint8_t) * ((key_len + 7)/8);
171 	uint32_t newlen = sizeof (struct xfrmnl_algo) + keysize;
172 
173@@ -1809,7 +1809,7 @@ int xfrmnl_sa_set_crypto_params (struct xfrmnl_sa* sa, const char* alg_name, uns
174 	memcpy (b->alg_key, key, keysize);
175 
176 	free(sa->crypt);
177-	sa->crypt = _nl_steal_pointer(&b);
178+	sa->crypt = b;
179 	sa->ce_mask |= XFRM_SA_ATTR_ALG_CRYPT;
180 	return 0;
181 }
182@@ -1848,7 +1848,7 @@ int xfrmnl_sa_get_comp_params (struct xfrmnl_sa* sa, char* alg_name, unsigned in
183 
184 int xfrmnl_sa_set_comp_params (struct xfrmnl_sa* sa, const char* alg_name, unsigned int key_len, const char* key)
185 {
186-	_nl_auto_free struct xfrmnl_algo *b = NULL;
187+	struct xfrmnl_algo *b = NULL;
188 	size_t keysize = sizeof (uint8_t) * ((key_len + 7)/8);
189 	uint32_t newlen = sizeof (struct xfrmnl_algo) + keysize;
190 
191@@ -1862,7 +1862,7 @@ int xfrmnl_sa_set_comp_params (struct xfrmnl_sa* sa, const char* alg_name, unsig
192 	memcpy (b->alg_key, key, keysize);
193 
194 	free(sa->comp);
195-	sa->comp = _nl_steal_pointer(&b);
196+	sa->comp = b;
197 	sa->ce_mask |= XFRM_SA_ATTR_ALG_COMP;
198 	return 0;
199 }
200@@ -2023,7 +2023,7 @@ int xfrmnl_sa_get_sec_ctx (struct xfrmnl_sa* sa, unsigned int* doi, unsigned int
201 int xfrmnl_sa_set_sec_ctx (struct xfrmnl_sa* sa, unsigned int doi, unsigned int alg, unsigned int len,
202                            unsigned int sid, const char* ctx_str)
203 {
204-	_nl_auto_free struct xfrmnl_user_sec_ctx *b = NULL;
205+	struct xfrmnl_user_sec_ctx *b = NULL;
206 
207 	if (!(b = calloc(1, sizeof (struct xfrmnl_user_sec_ctx) + 1 + len)))
208 		return -1;
209@@ -2037,7 +2037,7 @@ int xfrmnl_sa_set_sec_ctx (struct xfrmnl_sa* sa, unsigned int doi, unsigned int
210 	b->ctx[len] = '\0';
211 
212 	free(sa->sec_ctx);
213-	sa->sec_ctx = _nl_steal_pointer(&b);
214+	sa->sec_ctx = b;
215 	sa->ce_mask |= XFRM_SA_ATTR_SECCTX;
216 	return 0;
217 }
218@@ -2136,7 +2136,7 @@ int xfrmnl_sa_set_replay_state_esn (struct xfrmnl_sa* sa, unsigned int oseq, uns
219                                     unsigned int oseq_hi, unsigned int seq_hi, unsigned int replay_window,
220                                     unsigned int bmp_len, unsigned int* bmp)
221 {
222-	_nl_auto_free struct xfrmnl_replay_state_esn *b = NULL;
223+	struct xfrmnl_replay_state_esn *b = NULL;
224 
225 	if (!(b = calloc (1, sizeof (struct xfrmnl_replay_state_esn) + (sizeof (uint32_t) * bmp_len))))
226 		return -1;
227@@ -2150,7 +2150,7 @@ int xfrmnl_sa_set_replay_state_esn (struct xfrmnl_sa* sa, unsigned int oseq, uns
228 	memcpy (b->bmp, bmp, bmp_len * sizeof (uint32_t));
229 
230 	free(sa->replay_state_esn);
231-	sa->replay_state_esn = _nl_steal_pointer(&b);
232+	sa->replay_state_esn = b;
233 	sa->ce_mask |= XFRM_SA_ATTR_REPLAY_STATE;
234 	return 0;
235 }
236-- 
2372.23.0
238