[Xcb] How to cleanly terminate an xcb connection?

Carlo Wood carlo at alinoe.com
Tue Oct 12 16:00:40 UTC 2021


Hi,

upon program termination I sometimes (race condition) get a lot of
valgrind errors, for example:

==709259== Thread 5 ThreadPool03:
==709259== Invalid read of size 8
==709259==    at 0x488C908: ??? (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0x488A8C6: ??? (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0x488C08E: ??? (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0x488C1A1: xcb_wait_for_reply (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0xB5515DB: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB5468CB: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB547042: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xCE0495D: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCE027FA: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCE044FC: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCDF9D9C: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCDF9E9D: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==  Address 0x8443d20 is 4,240 bytes inside a block of size 21,168 free'd
==709259==    at 0x484118B: free (vg_replace_malloc.c:755)
==709259==    by 0x1B62AC: xcb::Connection::close() (linuxviewer/xcb-task/Connection.cxx:53)
==709259==    by 0x1B8E99: xcb::Connection::read_from_fd(int&, int) (linuxviewer/xcb-task/Connection.cxx:512)

Where in all (79) cases (for this run) the used memory was
freed in this way and linuxviewer/xcb-task/Connection.cxx:53 contains:

    xcb_disconnect(m_connection);

There are many other types of access, like

==709259== Invalid read of size 4
==709259==    at 0x488D65E: xcb_get_extension_data (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0xB551ADB: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB54709C: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xCE0495D: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCE027FA: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCE044FC: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCDF9D9C: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCDF9E9D: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xCDFA050: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==    by 0xB54622A: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0x1049D608: DispatchDestroySwapchainKHR(VkDevice_T*, VkSwapchainKHR_T*, VkAllocationCallbacks const*) (layer_chassis_dispatch.cpp:473)
==709259==    by 0x10417696: vulkan_layer_chassis::DestroySwapchainKHR(VkDevice_T*, VkSwapchainKHR_T*, VkAllocationCallbacks const*) (chassis.cpp:4809)
==709259==  Address 0x8442c90 is 0 bytes inside a block of size 21,168 free'd
==709259==    at 0x484118B: free (vg_replace_malloc.c:755)
==709259==    by 0x1B62AC: xcb::Connection::close() (linuxviewer/xcb-task/Connection.cxx:53)

But most are somewhere inside xcb_wait_for_reply.

Apparently I am not allowed to just call xcb_disconnect.
What is the correct way to terminate a connection so that these
invalid memory accesses won't happen?

Carlo

PS I also get an error during start up:

==709259== Thread 3 ThreadPool01:
==709259== Syscall param sendmsg(msg.msg_iov[0]) points to uninitialised byte(s)
==709259==    at 0x546E56D: sendmsg (in /usr/lib/libpthread-2.33.so)
==709259==    by 0x488A73B: ??? (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0x488AD80: ??? (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0x488B006: ??? (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0x488B87C: xcb_flush (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0xB550FD0: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB551FC9: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB54C06E: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB550D48: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB4EDB24: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB4EE47F: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xCB0158D: ??? (in /usr/lib/libnvidia-glcore.so.470.74)
==709259==  Address 0x7c385dd is 4,557 bytes inside a block of size 21,168 alloc'd
==709259==    at 0x48435FF: calloc (vg_replace_malloc.c:1117)
==709259==    by 0x488A2A1: xcb_connect_to_fd (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0x488E5C3: xcb_connect_to_display_with_auth_info (in /usr/lib/libxcb.so.1.1.0)
==709259==    by 0xDD813FA: _XConnectXCB (in /usr/lib/libX11.so.6.4.0)
==709259==    by 0xDD71958: XOpenDisplay (in /usr/lib/libX11.so.6.4.0)
==709259==    by 0xB546984: ??? (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0xB54765D: vk_icdNegotiateLoaderICDInterfaceVersion (in /usr/lib/libGLX_nvidia.so.470.74)
==709259==    by 0x48DA899: ??? (in /usr/lib/libvulkan.so.1.2.194)
==709259==    by 0x48DF418: ??? (in /usr/lib/libvulkan.so.1.2.194)
==709259==    by 0x48E1708: vkEnumerateInstanceExtensionProperties (in /usr/lib/libvulkan.so.1.2.194)
==709259==    by 0x1A865C: enumerateInstanceExtensionProperties<std::allocator<vk::ExtensionProperties>, vk::DispatchLoaderDynamic> (vulkan_funcs.hpp:488)
==709259==    by 0x1A865C: vulkan::InstanceCreateInfo::check_instance_extensions_availability() const (linuxviewer/src/vulkan/infos/InstanceCreateInfo.cxx:41)
==709259==    by 0x13A1C6: vulkan::Application::createInstance(vulkan::InstanceCreateInfo const&) (linuxviewer/src/vulkan/Application.cxx:251)

Really strange :/ Why would xcb_flush send uninitialized data over the socket?


More information about the Xcb mailing list