neighbor/upnp: remove D-Bus filter and match in Close()
Fixes use-after-free crash bug during MPD shutdown.
This commit is contained in:
		
							
								
								
									
										2
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								NEWS
									
									
									
									
									
								
							@@ -12,6 +12,8 @@ ver 0.21.25 (not yet released)
 | 
				
			|||||||
* output
 | 
					* output
 | 
				
			||||||
  - osx: improve sample rate selection
 | 
					  - osx: improve sample rate selection
 | 
				
			||||||
  - osx: fix noise while stopping
 | 
					  - osx: fix noise while stopping
 | 
				
			||||||
 | 
					* neighbor
 | 
				
			||||||
 | 
					  - upnp: fix crash during shutdown
 | 
				
			||||||
* Windows/Android:
 | 
					* Windows/Android:
 | 
				
			||||||
  - fix Boost detection after breaking change in Meson 0.54
 | 
					  - fix Boost detection after breaking change in Meson 0.54
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,11 @@ ToNeighborInfo(const UDisks2::Object &o) noexcept
 | 
				
			|||||||
	return {o.GetUri(), o.path};
 | 
						return {o.GetUri(), o.path};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static constexpr char udisks_neighbor_match[] =
 | 
				
			||||||
 | 
						"type='signal',sender='" UDISKS2_INTERFACE "',"
 | 
				
			||||||
 | 
						"interface='" DBUS_OM_INTERFACE "',"
 | 
				
			||||||
 | 
						"path='" UDISKS2_PATH "'";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UdisksNeighborExplorer final
 | 
					class UdisksNeighborExplorer final
 | 
				
			||||||
	: public NeighborExplorer {
 | 
						: public NeighborExplorer {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -110,11 +115,7 @@ UdisksNeighborExplorer::DoOpen()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	try {
 | 
						try {
 | 
				
			||||||
		Error error;
 | 
							Error error;
 | 
				
			||||||
		dbus_bus_add_match(connection,
 | 
							dbus_bus_add_match(connection, udisks_neighbor_match, error);
 | 
				
			||||||
				   "type='signal',sender='" UDISKS2_INTERFACE "',"
 | 
					 | 
				
			||||||
				   "interface='" DBUS_OM_INTERFACE "',"
 | 
					 | 
				
			||||||
				   "path='" UDISKS2_PATH "'",
 | 
					 | 
				
			||||||
				   error);
 | 
					 | 
				
			||||||
		error.CheckThrow("DBus AddMatch error");
 | 
							error.CheckThrow("DBus AddMatch error");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		dbus_connection_add_filter(connection,
 | 
							dbus_connection_add_filter(connection,
 | 
				
			||||||
@@ -147,8 +148,10 @@ UdisksNeighborExplorer::DoClose() noexcept
 | 
				
			|||||||
		list_request.Cancel();
 | 
							list_request.Cancel();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: remove_match
 | 
						auto &connection = GetConnection();
 | 
				
			||||||
	// TODO: remove_filter
 | 
					
 | 
				
			||||||
 | 
						dbus_connection_remove_filter(connection, HandleMessage, this);
 | 
				
			||||||
 | 
						dbus_bus_remove_match(connection, udisks_neighbor_match, nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dbus_glue.Destruct();
 | 
						dbus_glue.Destruct();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user