mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-31 16:02:43 +01:00 
			
		
		
		
	Partially revert 3af1853260 to fix use-after-free
				
					
				
			After upgrading to the latest release of Waybar the bar will crash
whenever I close the laptop lid. After some debugging I believe it is
because the watching added by watch_name is not being correctly canceled
using unwatch_name. After the Tray object and Host object are destroyed,
additional callbacks will become use-after-free.
Looks like commit 3af1853260 removed the
unwatch_name. I'm not sure why it did that, but it seemed dangerous.
Additionally, bus_name_id_ is created by own_name. According to that
function's documentation, the correct inverse operation is unown_name.
			
			
This commit is contained in:
		| @@ -19,9 +19,13 @@ Host::Host(const std::size_t id, const Json::Value& config, const Bar& bar, | |||||||
|  |  | ||||||
| Host::~Host() { | Host::~Host() { | ||||||
|   if (bus_name_id_ > 0) { |   if (bus_name_id_ > 0) { | ||||||
|     Gio::DBus::unwatch_name(bus_name_id_); |     Gio::DBus::unown_name(bus_name_id_); | ||||||
|     bus_name_id_ = 0; |     bus_name_id_ = 0; | ||||||
|   } |   } | ||||||
|  |   if (watcher_id_ > 0) { | ||||||
|  |     Gio::DBus::unwatch_name(watcher_id_); | ||||||
|  |     watcher_id_ = 0; | ||||||
|  |   } | ||||||
|   g_cancellable_cancel(cancellable_); |   g_cancellable_cancel(cancellable_); | ||||||
|   g_clear_object(&cancellable_); |   g_clear_object(&cancellable_); | ||||||
|   g_clear_object(&watcher_); |   g_clear_object(&watcher_); | ||||||
|   | |||||||
| @@ -14,6 +14,10 @@ Watcher::Watcher() | |||||||
|       watcher_(sn_watcher_skeleton_new()) {} |       watcher_(sn_watcher_skeleton_new()) {} | ||||||
|  |  | ||||||
| Watcher::~Watcher() { | Watcher::~Watcher() { | ||||||
|  |   if (hosts_ != nullptr) { | ||||||
|  |     g_slist_free_full(hosts_, gfWatchFree); | ||||||
|  |     hosts_ = nullptr; | ||||||
|  |   } | ||||||
|   if (items_ != nullptr) { |   if (items_ != nullptr) { | ||||||
|     g_slist_free_full(items_, gfWatchFree); |     g_slist_free_full(items_, gfWatchFree); | ||||||
|     items_ = nullptr; |     items_ = nullptr; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Yifei Teng
					Yifei Teng