(char*) memdupa_suffix0(_t, strnlen(_t, (n))); \
})
+/* Free every element of the array. */
+static inline void free_many(void **p, size_t n) {
+ assert(p || n == 0);
+
+ FOREACH_ARRAY(i, p, n)
+ *i = mfree(*i);
+}
+
+/* Typesafe wrapper for char** rather than void**. Unfortunately C won't implicitly cast this. */
+static inline void free_many_charp(char **c, size_t n) {
+ free_many((void**) c, n);
+}
+
#include "memory-util.h"
r = -ENXIO;
fail:
- for (i = 0; i < n; i++)
- free(v[i]);
-
+ free_many_charp(v, n);
return r;
done:
r = extract_first_word(p, &l[c], separators, flags);
if (r < 0) {
- int j;
-
- for (j = 0; j < c; j++)
- free(l[j]);
-
+ free_many_charp(l, c);
return r;
}
}
void locale_variables_free(char *l[_VARIABLE_LC_MAX]) {
- if (!l)
- return;
-
- for (LocaleVariable i = 0; i < _VARIABLE_LC_MAX; i++)
- l[i] = mfree(l[i]);
+ free_many_charp(l, _VARIABLE_LC_MAX);
}
void locale_variables_simplify(char *l[_VARIABLE_LC_MAX]) {
}
void rlimit_free_all(struct rlimit **rl) {
- int i;
-
- if (!rl)
- return;
-
- for (i = 0; i < _RLIMIT_MAX; i++)
- rl[i] = mfree(rl[i]);
+ free_many((void**) rl, _RLIMIT_MAX);
}
int rlimit_nofile_bump(int limit) {
return (int) i;
rollback:
- for (size_t j = 0; j < i; j++)
- free(t[p + j]);
-
+ free_many_charp(t + p, i);
t[p] = NULL;
return -ENOMEM;
}
p->n_auxiliary_fds = 0;
clear:
- for (size_t i = 0; i < n; ++i)
- free(ent[i]);
-
+ free_many((void**) ent, n);
return r;
}
r = 0;
finish:
- for (size_t i = 0; i < n_message_parts; i++)
- free(message_parts[i]);
+ free_many_charp(message_parts, n_message_parts);
for (size_t i = 0; i < n_iovec; i++)
free(iovec[i].iov_base);
if (!options)
return NULL;
- for (unsigned i = 0; i < SD_DHCP_OPTION_PRIVATE_LAST - SD_DHCP_OPTION_PRIVATE_BASE + 1; i++)
- free(options[i]);
+ free_many_charp(options, SD_DHCP_OPTION_PRIVATE_LAST - SD_DHCP_OPTION_PRIVATE_BASE + 1);
return mfree(options);
}