_dbus_accept_with_noncefile: Don't leak nonce

This was always leaked, both on success and on error.

Signed-off-by: Simon McVittie <smcv@collabora.com>
Reviewed-by: Philip Withnall <withnall@endlessm.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=103597
(cherry picked from commit 37d5af203c)
This commit is contained in:
Simon McVittie 2017-11-06 19:11:32 +00:00
parent d000891624
commit a208e02421

View file

@ -165,24 +165,36 @@ _dbus_read_nonce (const DBusString *fname, DBusString *nonce, DBusError* error)
DBusSocket
_dbus_accept_with_noncefile (DBusSocket listen_fd, const DBusNonceFile *noncefile)
{
DBusSocket fd;
DBusSocket fd = _dbus_socket_get_invalid ();
DBusString nonce;
_dbus_assert (noncefile != NULL);
/* Make it valid to "free" this even if _dbus_string_init() runs
* out of memory: see comment in do_check_nonce() */
_dbus_string_init_const (&nonce, "");
if (!_dbus_string_init (&nonce))
return _dbus_socket_get_invalid ();
goto out;
//PENDING(kdab): set better errors
if (_dbus_read_nonce (_dbus_noncefile_get_path(noncefile), &nonce, NULL) != TRUE)
return _dbus_socket_get_invalid ();
goto out;
fd = _dbus_accept (listen_fd);
if (!_dbus_socket_is_valid (fd))
return fd;
goto out;
if (do_check_nonce(fd, &nonce, NULL) != TRUE) {
_dbus_verbose ("nonce check failed. Closing socket.\n");
_dbus_close_socket(fd, NULL);
return _dbus_socket_get_invalid ();
_dbus_socket_invalidate (&fd);
goto out;
}
out:
_dbus_string_free (&nonce);
return fd;
}