mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 13:53:31 +01:00
Remove workaround code for systems where free(NULL) is busted.
Add an autoconf test to make sure we won't regret it. Closes ticket 24484.
This commit is contained in:
parent
7a74b3663f
commit
4dc228e35b
4
changes/bug24484
Normal file
4
changes/bug24484
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
o Code simplification and refactoring:
|
||||||
|
- Since Tor requires C99, remove our old workaround code for libc
|
||||||
|
implementations where free(NULL) doesn't work. Closes ticket 24484.
|
||||||
|
|
15
configure.ac
15
configure.ac
@ -615,6 +615,21 @@ fi
|
|||||||
AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
|
AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
|
||||||
test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
|
test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([whether free(NULL) works])
|
||||||
|
AC_RUN_IFELSE([AC_LANG_PROGRAM([
|
||||||
|
#include <stdlib.h>
|
||||||
|
], [
|
||||||
|
char *p = NULL;
|
||||||
|
free(p);
|
||||||
|
])],
|
||||||
|
[free_null_ok=true; AC_MSG_RESULT(yes)],
|
||||||
|
[free_null_ok=false; AC_MSG_RESULT(no)],
|
||||||
|
[free_null_ok=cross; AC_MSG_RESULT(cross)])
|
||||||
|
|
||||||
|
if test "$free_null_ok" = "false"; then
|
||||||
|
AC_MSG_ERROR([Your libc implementation doesn't allow free(NULL), as required by C99.])
|
||||||
|
fi
|
||||||
|
|
||||||
dnl ------------------------------------------------------
|
dnl ------------------------------------------------------
|
||||||
dnl Where do you live, libevent? And how do we call you?
|
dnl Where do you live, libevent? And how do we call you?
|
||||||
|
|
||||||
|
@ -73,9 +73,9 @@ extern int dmalloc_free(const char *file, const int line, void *pnt,
|
|||||||
} \
|
} \
|
||||||
STMT_END
|
STMT_END
|
||||||
#else /* !(defined(USE_DMALLOC)) */
|
#else /* !(defined(USE_DMALLOC)) */
|
||||||
/** Release memory allocated by tor_malloc, tor_realloc, tor_strdup, etc.
|
/** Release memory allocated by tor_malloc, tor_realloc, tor_strdup,
|
||||||
* Unlike the free() function, tor_free() will still work on NULL pointers,
|
* etc. Unlike the free() function, the tor_free() macro sets the
|
||||||
* and it sets the pointer value to NULL after freeing it.
|
* pointer value to NULL after freeing it.
|
||||||
*
|
*
|
||||||
* This is a macro. If you need a function pointer to release memory from
|
* This is a macro. If you need a function pointer to release memory from
|
||||||
* tor_malloc(), use tor_free_().
|
* tor_malloc(), use tor_free_().
|
||||||
@ -88,17 +88,13 @@ extern int dmalloc_free(const char *file, const int line, void *pnt,
|
|||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define tor_free(p) STMT_BEGIN \
|
#define tor_free(p) STMT_BEGIN \
|
||||||
typeof(&(p)) tor_free__tmpvar = &(p); \
|
typeof(&(p)) tor_free__tmpvar = &(p); \
|
||||||
if (PREDICT_LIKELY((*tor_free__tmpvar)!=NULL)) { \
|
raw_free(*tor_free__tmpvar); \
|
||||||
raw_free(*tor_free__tmpvar); \
|
*tor_free__tmpvar=NULL; \
|
||||||
*tor_free__tmpvar=NULL; \
|
|
||||||
} \
|
|
||||||
STMT_END
|
STMT_END
|
||||||
#else
|
#else
|
||||||
#define tor_free(p) STMT_BEGIN \
|
#define tor_free(p) STMT_BEGIN \
|
||||||
if (PREDICT_LIKELY((p)!=NULL)) { \
|
raw_free(p); \
|
||||||
raw_free(p); \
|
(p)=NULL; \
|
||||||
(p)=NULL; \
|
|
||||||
} \
|
|
||||||
STMT_END
|
STMT_END
|
||||||
#endif
|
#endif
|
||||||
#endif /* defined(USE_DMALLOC) */
|
#endif /* defined(USE_DMALLOC) */
|
||||||
|
Loading…
Reference in New Issue
Block a user