mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
657ff55408
Minimizing includes revealed other places includes were necessary.
93 lines
3.4 KiB
C
93 lines
3.4 KiB
C
/* Copyright (c) 2003-2004, Roger Dingledine
|
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
|
* Copyright (c) 2007-2018, The Tor Project, Inc. */
|
|
/* See LICENSE for licensing information */
|
|
|
|
/**
|
|
* \file util_malloc.h
|
|
* \brief Headers for util_malloc.c
|
|
**/
|
|
|
|
#ifndef TOR_UTIL_MALLOC_H
|
|
#define TOR_UTIL_MALLOC_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
#include "lib/cc/compat_compiler.h"
|
|
|
|
/* Memory management */
|
|
void *tor_malloc_(size_t size) ATTR_MALLOC;
|
|
void *tor_malloc_zero_(size_t size) ATTR_MALLOC;
|
|
void *tor_calloc_(size_t nmemb, size_t size) ATTR_MALLOC;
|
|
void *tor_realloc_(void *ptr, size_t size);
|
|
void *tor_reallocarray_(void *ptr, size_t size1, size_t size2);
|
|
char *tor_strdup_(const char *s) ATTR_MALLOC ATTR_NONNULL((1));
|
|
char *tor_strndup_(const char *s, size_t n)
|
|
ATTR_MALLOC ATTR_NONNULL((1));
|
|
void *tor_memdup_(const void *mem, size_t len)
|
|
ATTR_MALLOC ATTR_NONNULL((1));
|
|
void *tor_memdup_nulterm_(const void *mem, size_t len)
|
|
ATTR_MALLOC ATTR_NONNULL((1));
|
|
void tor_free_(void *mem);
|
|
|
|
/** Release memory allocated by tor_malloc, tor_realloc, tor_strdup,
|
|
* etc. Unlike the free() function, the tor_free() macro sets the
|
|
* pointer value to NULL after freeing it.
|
|
*
|
|
* This is a macro. If you need a function pointer to release memory from
|
|
* tor_malloc(), use tor_free_().
|
|
*
|
|
* Note that this macro takes the address of the pointer it is going to
|
|
* free and clear. If that pointer is stored with a nonstandard
|
|
* alignment (eg because of a "packed" pragma) it is not correct to use
|
|
* tor_free().
|
|
*/
|
|
#ifdef __GNUC__
|
|
#define tor_free(p) STMT_BEGIN \
|
|
typeof(&(p)) tor_free__tmpvar = &(p); \
|
|
raw_free(*tor_free__tmpvar); \
|
|
*tor_free__tmpvar=NULL; \
|
|
STMT_END
|
|
#else
|
|
#define tor_free(p) STMT_BEGIN \
|
|
raw_free(p); \
|
|
(p)=NULL; \
|
|
STMT_END
|
|
#endif
|
|
|
|
#define tor_malloc(size) tor_malloc_(size)
|
|
#define tor_malloc_zero(size) tor_malloc_zero_(size)
|
|
#define tor_calloc(nmemb,size) tor_calloc_(nmemb, size)
|
|
#define tor_realloc(ptr, size) tor_realloc_(ptr, size)
|
|
#define tor_reallocarray(ptr, sz1, sz2) \
|
|
tor_reallocarray_((ptr), (sz1), (sz2))
|
|
#define tor_strdup(s) tor_strdup_(s)
|
|
#define tor_strndup(s, n) tor_strndup_(s, n)
|
|
#define tor_memdup(s, n) tor_memdup_(s, n)
|
|
#define tor_memdup_nulterm(s, n) tor_memdup_nulterm_(s, n)
|
|
|
|
/* Aliases for the underlying system malloc/realloc/free. Only use
|
|
* them to indicate "I really want the underlying system function, I know
|
|
* what I'm doing." */
|
|
#define raw_malloc malloc
|
|
#define raw_realloc realloc
|
|
#define raw_free free
|
|
#define raw_strdup strdup
|
|
|
|
/* Helper macro: free a variable of type 'typename' using freefn, and
|
|
* set the variable to NULL.
|
|
*/
|
|
#define FREE_AND_NULL(typename, freefn, var) \
|
|
do { \
|
|
/* only evaluate (var) once. */ \
|
|
typename **tmp__free__ptr ## freefn = &(var); \
|
|
freefn(*tmp__free__ptr ## freefn); \
|
|
(*tmp__free__ptr ## freefn) = NULL; \
|
|
} while (0)
|
|
|
|
#ifdef UTIL_MALLOC_PRIVATE
|
|
STATIC int size_mul_check(const size_t x, const size_t y);
|
|
#endif
|
|
|
|
#endif /* !defined(TOR_UTIL_MALLOC_H) */
|