X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fdbus-loop.c;h=fadbd439580425d4b045eb93592fa3255c112fd9;hp=da0a00443a08cc5dbe718abdcc298a31c62bc36d;hb=e8e581bf256b8c0fbd430935af79fa0e8ee570a1;hpb=3bdf9c1d0a241eff2d17591854172725682b27cd diff --git a/src/shared/dbus-loop.c b/src/shared/dbus-loop.c index da0a00443..fadbd4395 100644 --- a/src/shared/dbus-loop.c +++ b/src/shared/dbus-loop.c @@ -44,8 +44,8 @@ typedef struct EpollData { } EpollData; static dbus_bool_t add_watch(DBusWatch *watch, void *data) { - EpollData *e; - struct epoll_event ev; + EpollData _cleanup_free_ *e = NULL; + struct epoll_event ev = {}; assert(watch); @@ -57,16 +57,13 @@ static dbus_bool_t add_watch(DBusWatch *watch, void *data) { e->object = watch; e->is_timeout = false; - zero(ev); ev.events = bus_flags_to_events(watch); ev.data.ptr = e; if (epoll_ctl(PTR_TO_INT(data), EPOLL_CTL_ADD, e->fd, &ev) < 0) { - if (errno != EEXIST) { - free(e); + if (errno != EEXIST) return FALSE; - } /* Hmm, bloody D-Bus creates multiple watches on the * same fd. epoll() does not like that. As a dirty @@ -74,14 +71,11 @@ static dbus_bool_t add_watch(DBusWatch *watch, void *data) { * one we can safely add to the epoll(). */ e->fd = dup(e->fd); - if (e->fd < 0) { - free(e); + if (e->fd < 0) return FALSE; - } if (epoll_ctl(PTR_TO_INT(data), EPOLL_CTL_ADD, e->fd, &ev) < 0) { close_nointr_nofail(e->fd); - free(e); return FALSE; } @@ -89,12 +83,13 @@ static dbus_bool_t add_watch(DBusWatch *watch, void *data) { } dbus_watch_set_data(watch, e, NULL); + e = NULL; /* prevent freeing */ return TRUE; } static void remove_watch(DBusWatch *watch, void *data) { - EpollData *e; + EpollData _cleanup_free_ *e = NULL; assert(watch); @@ -106,13 +101,11 @@ static void remove_watch(DBusWatch *watch, void *data) { if (e->fd_is_dupped) close_nointr_nofail(e->fd); - - free(e); } static void toggle_watch(DBusWatch *watch, void *data) { EpollData *e; - struct epoll_event ev; + struct epoll_event ev = {}; assert(watch); @@ -120,21 +113,18 @@ static void toggle_watch(DBusWatch *watch, void *data) { if (!e) return; - zero(ev); - ev.events = bus_flags_to_events(watch); ev.data.ptr = e; + ev.events = bus_flags_to_events(watch); assert_se(epoll_ctl(PTR_TO_INT(data), EPOLL_CTL_MOD, e->fd, &ev) == 0); } static int timeout_arm(EpollData *e) { - struct itimerspec its; + struct itimerspec its = {}; assert(e); assert(e->is_timeout); - zero(its); - if (dbus_timeout_get_enabled(e->object)) { timespec_store(&its.it_value, dbus_timeout_get_interval(e->object) * USEC_PER_MSEC); its.it_interval = its.it_value; @@ -148,7 +138,7 @@ static int timeout_arm(EpollData *e) { static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) { EpollData *e; - struct epoll_event ev; + struct epoll_event ev = {}; assert(timeout); @@ -166,7 +156,6 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) { if (timeout_arm(e) < 0) goto fail; - zero(ev); ev.events = EPOLLIN; ev.data.ptr = e; @@ -186,7 +175,7 @@ fail: } static void remove_timeout(DBusTimeout *timeout, void *data) { - EpollData *e; + EpollData _cleanup_free_ *e = NULL; assert(timeout); @@ -196,7 +185,6 @@ static void remove_timeout(DBusTimeout *timeout, void *data) { assert_se(epoll_ctl(PTR_TO_INT(data), EPOLL_CTL_DEL, e->fd, NULL) >= 0); close_nointr_nofail(e->fd); - free(e); } static void toggle_timeout(DBusTimeout *timeout, void *data) { @@ -234,13 +222,11 @@ int bus_loop_open(DBusConnection *c) { int bus_loop_dispatch(int fd) { int n; - struct epoll_event event; + struct epoll_event event = {}; EpollData *d; assert(fd >= 0); - zero(event); - n = epoll_wait(fd, &event, 1, 0); if (n < 0) return errno == EAGAIN || errno == EINTR ? 0 : -errno;