Browse Source

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.
Nick Mathewson 6 years ago
parent
commit
4dc228e35b
3 changed files with 26 additions and 11 deletions
  1. 4 0
      changes/bug24484
  2. 15 0
      configure.ac
  3. 7 11
      src/common/util.h

+ 4 - 0
changes/bug24484

@@ -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 - 0
configure.ac

@@ -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?
 

+ 7 - 11
src/common/util.h

@@ -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) */