diff options
author | Lennart Poettering <lennart@poettering.net> | 2021-03-12 22:21:40 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-05-15 19:54:55 +0200 |
commit | e523386e198bd0729858f1c78ef808930ba12020 (patch) | |
tree | b0d644d83b7fb499ec6f3fca4479762f734421c4 | |
parent | dd4f87a8d138d5307cf00c958da0da70dc542a2c (diff) | |
download | systemd-e523386e198bd0729858f1c78ef808930ba12020.tar.gz |
Revert "varlink: avoid using dangling ref in varlink_close_unref()"
This reverts commit 39ad3f1c092b5dffcbb4b1d12eb9ca407f010a3c.
(cherry picked from commit cc6b0a18ff73325e2ecf0c5d857f4fdca75d97b4)
(cherry picked from commit 906b89a284308a64e599e7e4230763bb60a16895)
-rw-r--r-- | src/shared/varlink.c | 30 |
1 files changed, 6 insertions, 24 deletions
diff --git a/src/shared/varlink.c b/src/shared/varlink.c index a7a2fff0d7..78329df4d9 100644 --- a/src/shared/varlink.c +++ b/src/shared/varlink.c @@ -1193,9 +1193,8 @@ int varlink_close(Varlink *v) { varlink_set_state(v, VARLINK_DISCONNECTED); - /* Let's take a reference first, since varlink_detach_server() might drop the final ref from the - * disconnect callback, which would invalidate the pointer we are holding before we can call - * varlink_clear(). */ + /* Let's take a reference first, since varlink_detach_server() might drop the final (dangling) ref + * which would destroy us before we can call varlink_clear() */ varlink_ref(v); varlink_detach_server(v); varlink_clear(v); @@ -1209,32 +1208,15 @@ Varlink* varlink_close_unref(Varlink *v) { if (!v) return NULL; - /* A reference is given to us to be destroyed. But when calling varlink_close(), a callback might - * also drop a reference. We allow this, and will hold a temporary reference to the object to make - * sure that the object still exists when control returns to us. If there's just one reference - * remaining after varlink_close(), even though there were at least two right before, we'll handle - * that gracefully instead of crashing. - * - * In other words, this call drops the donated reference, but if the internal call to varlink_close() - * dropped a reference to, we don't drop the reference afain. This allows the caller to say: - * global_object->varlink = varlink_close_unref(global_object->varlink); - * even though there is some callback which has access to global_object and may drop the reference - * stored in global_object->varlink. Without this step, the same code would have to be written as: - * Varlink *t = TAKE_PTR(global_object->varlink); - * varlink_close_unref(t); - */ - /* n_ref >= 1 */ - varlink_ref(v); /* n_ref >= 2 */ - varlink_close(v); /* n_ref >= 1 */ - if (v->n_ref > 1) - v->n_ref--; /* n_ref >= 1 */ + (void) varlink_close(v); return varlink_unref(v); } Varlink* varlink_flush_close_unref(Varlink *v) { - if (v) - varlink_flush(v); + if (!v) + return NULL; + (void) varlink_flush(v); return varlink_close_unref(v); } |