[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [tor] 02/08: Use tor_event_free instead of event_del+tor_free



This is an automated email from the git hooks/post-receive script.

dgoulet pushed a commit to branch main
in repository tor.

commit 15e95c3bda1e3781a7f7175de4e65a749e9d6a2c
Author: Alex Xu (Hello71) <alex_y_xu@xxxxxxxx>
AuthorDate: Tue Apr 19 22:50:31 2022 -0400

    Use tor_event_free instead of event_del+tor_free
    
    Using tor_free is wrong; event_free must be called for objects obtained from
    event_new. Additionally, this slightly simplifies the code.
    
    Also, add a static_assert to prevent further instances.
---
 src/core/mainloop/mainloop.c | 12 ++----------
 src/lib/malloc/malloc.h      |  4 ++++
 src/test/test_connection.c   | 21 +++++----------------
 3 files changed, 11 insertions(+), 26 deletions(-)

diff --git a/src/core/mainloop/mainloop.c b/src/core/mainloop/mainloop.c
index cd57dea3d4..fe763f7d0f 100644
--- a/src/core/mainloop/mainloop.c
+++ b/src/core/mainloop/mainloop.c
@@ -274,16 +274,8 @@ connection_add_impl(connection_t *conn, int is_connecting)
 void
 connection_unregister_events(connection_t *conn)
 {
-  if (conn->read_event) {
-    if (event_del(conn->read_event))
-      log_warn(LD_BUG, "Error removing read event for %d", (int)conn->s);
-    tor_free(conn->read_event);
-  }
-  if (conn->write_event) {
-    if (event_del(conn->write_event))
-      log_warn(LD_BUG, "Error removing write event for %d", (int)conn->s);
-    tor_free(conn->write_event);
-  }
+  tor_event_free(conn->read_event);
+  tor_event_free(conn->write_event);
   if (conn->type == CONN_TYPE_AP_DNS_LISTENER) {
     dnsserv_close_listener(conn);
   }
diff --git a/src/lib/malloc/malloc.h b/src/lib/malloc/malloc.h
index cc031f843a..48a3ac32cf 100644
--- a/src/lib/malloc/malloc.h
+++ b/src/lib/malloc/malloc.h
@@ -11,6 +11,7 @@
 #ifndef TOR_UTIL_MALLOC_H
 #define TOR_UTIL_MALLOC_H
 
+#include <assert.h>
 #include <stddef.h>
 #include <stdlib.h>
 #include "lib/cc/compat_compiler.h"
@@ -45,6 +46,9 @@ void tor_free_(void *mem);
 #ifdef __GNUC__
 #define tor_free(p) STMT_BEGIN                                 \
     typeof(&(p)) tor_free__tmpvar = &(p);                      \
+    _Static_assert(!__builtin_types_compatible_p(typeof(*tor_free__tmpvar), \
+                                                 struct event *), \
+                   "use tor_event_free for struct event *");   \
     raw_free(*tor_free__tmpvar);                               \
     *tor_free__tmpvar=NULL;                                    \
   STMT_END
diff --git a/src/test/test_connection.c b/src/test/test_connection.c
index fbf9d6a5ab..ed94fe8aaa 100644
--- a/src/test/test_connection.c
+++ b/src/test/test_connection.c
@@ -22,6 +22,7 @@
 #include "feature/dircommon/directory.h"
 #include "core/or/connection_or.h"
 #include "lib/net/resolve.h"
+#include "lib/evloop/compat_libevent.h"
 
 #include "test/test_connection.h"
 #include "test/test_helpers.h"
@@ -113,14 +114,8 @@ test_conn_get_basic_teardown(const struct testcase_t *tc, void *arg)
     /* We didn't call tor_libevent_initialize(), so event_base was NULL,
      * so we can't rely on connection_unregister_events() use of event_del().
      */
-    if (conn->linked_conn->read_event) {
-      tor_free(conn->linked_conn->read_event);
-      conn->linked_conn->read_event = NULL;
-    }
-    if (conn->linked_conn->write_event) {
-      tor_free(conn->linked_conn->write_event);
-      conn->linked_conn->write_event = NULL;
-    }
+    tor_event_free(conn->linked_conn->read_event);
+    tor_event_free(conn->linked_conn->write_event);
 
     if (!conn->linked_conn->marked_for_close) {
       connection_close_immediate(conn->linked_conn);
@@ -142,14 +137,8 @@ test_conn_get_basic_teardown(const struct testcase_t *tc, void *arg)
   /* We didn't set the events up properly, so we can't use event_del() in
    * close_closeable_connections() > connection_free()
    * > connection_unregister_events() */
-  if (conn->read_event) {
-    tor_free(conn->read_event);
-    conn->read_event = NULL;
-  }
-  if (conn->write_event) {
-    tor_free(conn->write_event);
-    conn->write_event = NULL;
-  }
+  tor_event_free(conn->read_event);
+  tor_event_free(conn->write_event);
 
   if (!conn->marked_for_close) {
     connection_close_immediate(conn);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits