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:
Nick Mathewson 2018-01-25 17:04:12 -05:00
parent 7a74b3663f
commit 4dc228e35b
3 changed files with 26 additions and 11 deletions

4
changes/bug24484 Normal file
View 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.

View File

@ -615,6 +615,21 @@ fi
AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
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 Where do you live, libevent? And how do we call you?

View File

@ -73,9 +73,9 @@ extern int dmalloc_free(const char *file, const int line, void *pnt,
} \
STMT_END
#else /* !(defined(USE_DMALLOC)) */
/** Release memory allocated by tor_malloc, tor_realloc, tor_strdup, etc.
* Unlike the free() function, tor_free() will still work on NULL pointers,
* and it sets the pointer value to NULL after freeing it.
/** 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_().
@ -88,17 +88,13 @@ extern int dmalloc_free(const char *file, const int line, void *pnt,
#ifdef __GNUC__
#define tor_free(p) STMT_BEGIN \
typeof(&(p)) tor_free__tmpvar = &(p); \
if (PREDICT_LIKELY((*tor_free__tmpvar)!=NULL)) { \
raw_free(*tor_free__tmpvar); \
*tor_free__tmpvar=NULL; \
} \
raw_free(*tor_free__tmpvar); \
*tor_free__tmpvar=NULL; \
STMT_END
#else
#define tor_free(p) STMT_BEGIN \
if (PREDICT_LIKELY((p)!=NULL)) { \
raw_free(p); \
(p)=NULL; \
} \
raw_free(p); \
(p)=NULL; \
STMT_END
#endif
#endif /* defined(USE_DMALLOC) */