# These three happen if valgrind doesn't notice and handle speculative # implementations of strchr/strlen/strcat properly. { visual_c_ignore_strchr Memcheck:Cond fun:strchr } { visual_c_ignore_strlen Memcheck:Cond fun:strlen } { visual_c_ignore_strcat Memcheck:Cond fun:strcat } # These two are because ioctl often involves structs with holes. # We need to either add one of these per ioctl, or # just make it apply for *any* call to NtFsControlFile. { wine_struct_hole_FILE_PIPE_WAIT_FOR_BUFFER Memcheck:Param writev(vector[1]) obj:* fun:wine_server_call fun:server_ioctl_file fun:NtFsControlFile fun:WaitNamedPipeW } { wine_struct_hole_FILE_PIPE_WAIT_FOR_BUFFER_NONOPTIMIZED Memcheck:Param writev(vector[1]) obj:* fun:send_request fun:wine_server_call fun:server_ioctl_file fun:NtFsControlFile fun:WaitNamedPipeW } { # See http://www.winehq.org/pipermail/wine-devel/2008-November/070539.html # We might want to add an annotationto WriteConsoleInputW # for the hole someday. wine_struct_hole_WriteConsoleInput Memcheck:Param writev(vector[...]) fun:writev fun:send_request fun:wine_server_call fun:wine_server_call_err fun:WriteConsoleInputW } # We sure got a lot of these in the logs when I first started. # I suppressed them to avoid dispair. { todo_wine_arrgh_wcstombs Memcheck:Value4 fun:wine_cp_wcstombs } # Now on to system bugs that aren't Wine's fault. { suppress_nss_leak Memcheck:Leak fun:malloc obj:* fun:__nss_database_lookup } { bogus_addr4_ldso_27 Memcheck:Addr4 obj:/lib*/ld-2.7.so } { bogus_addr4_ldso_261 Memcheck:Addr4 obj:/lib*/ld-2.6.1.so } { bogus_addr4_ldso_25 Memcheck:Addr4 obj:/lib*/ld-2.5.so } { bogus_addr4_ldso_236 Memcheck:Addr4 obj:/lib*/ld-2.3.6.so } { bogus_cond_ldso_27 Memcheck:Cond obj:/lib*/ld-2.7.so } { bogus_cond_ldso_261 Memcheck:Cond obj:/lib*/ld-2.6.1.so } { bogus_cond_ldso_25 Memcheck:Cond obj:/lib*/ld-2.5.so } { bogus_cond_ldso_236 Memcheck:Cond obj:/lib*/ld-2.3.6.so } { bogus_cond_libglcore_16912 Memcheck:Cond obj:/usr/lib*/libGLcore.so.169.12 } { bogus_value4_libglcore_16912 Memcheck:Value4 obj:/usr/lib*/libGLcore.so.169.12 } { bogus_addr2_libglcore_16912 Memcheck:Addr2 obj:/usr/lib*/libGLcore.so.169.12 } { suppress_ioctl_libglcore_18044 Memcheck:Param ioctl(generic) fun:ioctl obj:/usr/lib32/libGLcore.so.180.44 } { suppress_cond_libglcore_18044 Memcheck:Cond obj:/usr/lib32/libGLcore.so.180.44 } { bogus_addr4_libgl_109631 Memcheck:Addr4 obj:/usr/lib*/libGL.so.1.0.9631 } { bogus_addr4_libgl_109639 Memcheck:Addr4 obj:/usr/lib*/libGL.so.1.0.9639 } { suppress_leak_libgl_109631 Memcheck:Leak fun:malloc obj:/usr/lib*/libGL.so.1.0.9631 } { suppress_leak_libgl_18044 Memcheck:Leak fun:malloc obj:/usr/lib32/libGL.so.180.44 } { suppress_leak_wglGetProcAddress Memcheck:Leak fun:malloc obj:/usr/lib/libGL* ... fun:glXChooseVisual fun:has_opengl fun:X11DRV_wglGetProcAddress fun:wglGetProcAddress } { bogus_X11_1 Memcheck:Param write(buf) obj:* obj:/usr/lib*/libX11.so.6.2.0 } { bogus_X11_2 Memcheck:Param write(buf) obj:* obj:* obj:/usr/lib*/libX11.so.6.2.0 } { bogus_Xcursor_Cond Memcheck:Cond obj:/usr/lib*/libXcursor.so.1.0.2 } { bogus_Xcursor_Leak Memcheck:Leak fun:malloc obj:/usr/lib/libXcursor.so.1.0.2 } { suppress_i915_ioctl Memcheck:Param ioctl(generic) obj:* obj:/usr/lib*/dri/i915_dri.so } { suppress_i915_cond Memcheck:Cond obj:/usr/lib*/dri/i915_dri.so } { suppress_i915_value Memcheck:Value4 obj:/usr/lib*/dri/i915_dri.so } { suppress_i915_leak1 Memcheck:Leak fun:malloc obj:/usr/lib*/dri/i915_dri.so } { suppress_i915_leak2 Memcheck:Leak fun:memalign fun:* obj:/usr/lib*/dri/i915_dri.so } { suppress_libasound_overlap Memcheck:Overlap fun:memcpy obj:/usr/lib*/libasound.so.2.0.0 } { suppress_libasound_connect Memcheck:Param socketcall.connect(serv_addr..sun_path) obj:* obj:/usr/lib*/libasound.so.2.0.0 } { suppress_libasound_connect2 Memcheck:Cond fun:snd_pcm_direct_client_connect obj:/usr/lib*/libasound.so.2.0.0 } { suppress_libasound_bind Memcheck:Param socketcall.bind(my_addr..sun_path) obj:* obj:/usr/lib*/libasound.so.2.0.0 } { suppress_libasound_ioctl Memcheck:Param ioctl(arg) obj:* obj:/usr/lib*/libasound.so.2.0.0 } { suppress_libasound_ioctl2 Memcheck:Param ioctl(arg) obj:* fun:ioctl obj:/usr/lib*/libasound.so.2.0.0 } { suppress_libasound_semctl Memcheck:Param semctl(IPC_SET, arg.buf) obj:* obj:/usr/lib*/libasound.so.2.0.0 } { todo_suppress_libasound_leak Memcheck:Leak ... obj:/usr/lib*/libasound.so.2.0.0 } { todo_suppress_libfontconfig_leak Memcheck:Leak fun:malloc obj:/usr/lib*/libfontconfig.so.1.* } # thread_detach() should clean this up?? { todo_wine_dlls_winex11drv__x11drv_init_thread_data_main Memcheck:Leak ... fun:RtlAllocateHeap fun:x11drv_init_thread_data } # Supposedly there's a call back to X11DRV_DestroyIM at thread destruction time...? # and thread_detach() should also clean it up?? { todo_wine_dlls_winex11drv__x11drv_init_thread_data_xim Memcheck:Leak fun:malloc fun:_XimOpenIM fun:_XimRegisterIMInstantiateCallback fun:XRegisterIMInstantiateCallback fun:X11DRV_SetupXIM fun:x11drv_init_thread_data fun:x11drv_thread_data fun:X11DRV_SetWindowPos } { todo_wine_dlls_winex11drv__X11DRV_XRandR_Init Memcheck:Leak fun:*alloc fun:XInitExtension fun:XextAddDisplay obj:*/libXrandr* fun:XRRQueryExtension fun:X11DRV_XRandR_Init } { todo_wine_dlls_winex11drv__X11DRV_XRender_Init Memcheck:Leak fun:*alloc fun:XInitExtension fun:XRenderFindDisplay fun:XRenderQueryExtension fun:X11DRV_XRender_Init } { todo_wine_dlls_winex11drv__xinerama_init Memcheck:Leak fun:*alloc fun:XInitExtension fun:XextAddDisplay ... fun:XPanoramiXQueryExtension fun:XineramaQueryExtension ... fun:xinerama_init } { todo_wine_dlls_winex11drv__XkbUseExtension Memcheck:Leak fun:*alloc fun:XInitExtension fun:XkbUseExtension fun:XOpenDisplay } { todo_wine_dlls_winex11drv__X11DRV_XComposite_Init Memcheck:Leak fun:*alloc fun:XInitExtension fun:XCompositeFindDisplay fun:XCompositeQueryExtension } { todo_wine_dlls_winex11drv__X11DRV_XF86VM_Init Memcheck:Leak fun:*alloc fun:XInitExtension fun:XextAddDisplay fun:* fun:XF86VidModeQueryExtension fun:X11DRV_XF86VM_Init } { todo_wine_dlls_winex11drv_XOpenDisplay Memcheck:Leak fun:malloc ... fun:xcb_connect fun:_XConnectXCB fun:XOpenDisplay } { todo_wine_dlls_winex11drv_XOpenDisplay_2 Memcheck:Leak fun:malloc ... fun:xcb_get_extension_data fun:xcb_prefetch_maximum_request_length fun:xcb_get_maximum_request_length fun:XOpenDisplay fun:DllMain } { todo_suppress_alloc_module_leak Memcheck:Leak ... fun:RtlAllocateHeap fun:RtlCreateUnicodeString fun:alloc_module } { todo_suppress_dlopen_leak Memcheck:Leak fun:*alloc ... fun:dlopen } { todo_suppress_dlopen_leak2 Memcheck:Leak fun:*alloc ... fun:dl_open_worker fun:_dl_catch_error fun:_dl_open fun:dlopen_doit fun:_dl_catch_error } { suppress_dlopen_addr4 Memcheck:Addr4 ... fun:__libc_dlopen_mode } { todo_suppress_load_library_leak Memcheck:Leak ... fun:RtlAllocateHeap fun:RtlAnsiStringToUnicodeString fun:RtlCreateUnicodeStringFromAsciiz fun:get_load_order } { todo_suppress_wine_init_load_order_leak Memcheck:Leak ... fun:RtlAllocateHeap fun:RtlAnsiStringToUnicodeString fun:RtlCreateUnicodeStringFromAsciiz fun:init_load_order } # ntdll/loader.c explicitly avoids freeing when .exe's exit at the moment { todo_suppress_wine_alloc_module_leak Memcheck:Leak ... fun:RtlAllocateHeap fun:RtlCreateUnicodeString fun:alloc_module } { todo_suppress_explorer_leak Memcheck:Leak ... fun:RtlAllocateHeap fun:load_driver fun:loaderdrv_CreateDesktopWindow fun:WIN_CreateWindowEx fun:CreateWindowExW fun:manage_desktop fun:WinMain fun:main } { todo_suppress_exception_addr4 Memcheck:Addr4 fun:__wine_call_from_32_regs obj:/home/dank/wine-git/dlls/ntdll/ntdll.dll.so obj:/home/dank/wine-git/dlls/ntdll/ntdll.dll.so fun:raise_exception } { todo_ignore_bogus_writes_in_req_handler Memcheck:Param writev(vector[1]) obj:* fun:call_req_handler } # See comment in dlls/kernel32/tests/thread.c at end of threadFunc1 { suppress_wine_verify_lstrlenA_deadbeef_zero Memcheck:Addr1 fun:strlen fun:lstrlenA fun:threadFunc1 obj:/home/dank/wine-git/dlls/ntdll/ntdll.dll.so fun:call_thread_func } # test_UnpackDDElParam intentionally passes a bad pointer { suppress_wine_user32_dde_tests Memcheck:Addr2 fun:GlobalLock fun:UnpackDDElParam fun:test_UnpackDDElParam fun:func_dde fun:run_test fun:main } { suppress_gmtime Memcheck:Cond obj:* obj:* fun:gmtime fun:FileTimeToDosDateTime } { suppress_gmtime_r Memcheck:Cond obj:* obj:* fun:gmtime_r fun:FileTimeToDosDateTime } { suppress_if_name2index_glibc_27 Memcheck:Param ioctl(SIOCGIFINDEX) obj:/lib*/ld-2.7.so fun:getInterfaceIndexByName } { suppress_if_nameindex_glibc_23 Memcheck:Param socketcall.sendto(msg) obj:/lib*/ld-2.3.*.so fun:if_nameindex } { # See also http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=553016 # and http://bbs.archlinux.org/viewtopic.php?pid=273718 suppress_glibc_dl_relocate_object Memcheck:Cond fun:_dl_relocate_object } { # With ubuntu 9.04: # Uninitialised value was created by a stack allocation # at __libc_res_nsend (res_send.c:343) glibc_bug_libc_res_nsend Memcheck:Cond fun:__libc_res_nsend } # Naming convention for Wine suppressions: # If we think it's solid: # suppress_wine_dirname__functionname[_moreifneeded] # If we aren't sure, change suppress to todo { # intentionally frees an invalid pointer. # It would be nice if that were in a different # function, so we could suppress it specifically, # and not other possible warnings in the heap tests. suppress_wine_dlls_kernel32_tests__test_heap_invalid_free Memcheck:Free fun:notify_free fun:RtlFreeHeap fun:HeapFree fun:GlobalFree fun:test_heap fun:func_heap fun:run_test fun:main } { # Lots of little invalid things going on in this test suppress_wine_dlls_kernel32_tests_test_heap Memcheck:Addr2 ... fun:test_heap fun:func_heap fun:run_test fun:main } { suppress_wine_dlls_kernel32_tests__CreateThread_basic_badaccess Memcheck:Addr1 fun:strlen fun:lstrlenA fun:test_CreateThread_basic } { suppress_wine_dlls_kernel32_IsBadReadPtr Memcheck:Addr1 fun:IsBadReadPtr } { suppress_wine_dlls_kernel32__IsBadWritePtr Memcheck:Addr1 fun:IsBadWritePtr } { suppress_wine_dlls_kernel32_tests__doCrash Memcheck:Addr1 fun:doCrash } # This one is for a jump to zero done intentionally by the crypt32 tests # compiled with -O2, it looks like this? { suppress_wine_dlls_crypt32_tests__test_data_msg_O2 Memcheck:Addr4 fun:__wine_call_from_32_regs fun:CryptMsgUpdate fun:test_data_msg } # compiled with -O0, it looks like this? { suppress_wine_dlls_crypt32_tests__test_data_msg_O0 Memcheck:Jump obj:* fun:CryptMsgUpdate fun:test_data_msg_update fun:test_data_msg } # These two functions test error returned by file read/write with null buffers { suppress_wine_kernel32_tests__test_read_write_nullwrite Memcheck:Param write(buf) obj:/lib*/ld-*.so fun:WriteFile fun:test_read_write fun:func_file fun:run_test fun:main } { suppress_wine_kernel32_tests__test_read_write_nullread Memcheck:Param read(buf) obj:/lib*/ld-*.so fun:ReadFile fun:test_read_write fun:func_file fun:run_test fun:main } # test_SetThreadContext: # The code in question looks like this: #/* simulate a call to set_test_val(10) */ #stack = (int *)ctx.Esp; #stack[-1] = 10; #stack[-2] = ctx.Eip; # So we actually are writing to the stack, just not using 'proper' # access to the stack. { suppress_wine_kernel32_tests__test_SetThreadContext Memcheck:Addr4 fun:test_SetThreadContext fun:func_thread fun:run_test fun:main } { ignore_rsaenh_test_expected_bad_access Memcheck:Addr4 fun:CryptReleaseContext fun:clean_up_base_environment } # Back to system suppressions that aren't wine's fault # gecko is #1 in the list of offending upstream libraries... { todo_gecko_warnings_r_us Memcheck:Addr4 obj:*wine_gecko* } { todo_gecko_warnings_r_us2 Memcheck:Cond obj:*wine_gecko* } # followed by openssl { todo_openssl_warnings_r_us1a Memcheck:Addr4 obj:/usr/lib*/libcrypto.so* } { todo_openssl_warnings_r_us1b Memcheck:Value4 obj:/usr/lib*/*libcrypto.so* } { todo_openssl_warnings_r_us1c Memcheck:Cond obj:/usr/lib*/*libcrypto.so* } { todo_openssl_warnings_r_us2a Memcheck:Addr4 obj:* obj:/usr/lib*/*libcrypto.so* } { todo_openssl_warnings_r_us2b Memcheck:Value4 obj:* obj:/usr/lib*/*libcrypto.so* } { todo_openssl_warnings_r_us2c Memcheck:Cond obj:* obj:/usr/lib*/*libcrypto.so* } { todo_openssl_warnings_r_us1d Memcheck:Param write(buf) obj:* obj:/usr/lib*/*libcrypto.so* } { todo_openssl_warnings_r_us3a Memcheck:Addr4 obj:/usr/lib*/*libssl.so* } { todo_openssl_warnings_r_us3b Memcheck:Value4 obj:/usr/lib*/*libssl.so* } { todo_openssl_warnings_r_us3c Memcheck:Cond obj:/usr/lib*/*libssl.so* } { # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532059 # http://rt.openssl.org/index.html?q=1642 todo_openssl_warnings_mod_inverse Memcheck:Cond fun:BN_mod_inverse } { # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532059 # http://rt.openssl.org/index.html?q=1642 todo_openssl_warnings_div Memcheck:Cond fun:BN_div } # And sane { todo_sane_warnings_r_us Memcheck:Addr4 obj:*libsane* } { todo_sane_warnings_r_us2 Memcheck:Cond obj:*libsane* } # and visual C++ 6 { todo_visual_c_chkstk Memcheck:Addr4 fun:$$$00001 } { todo_visual_c_chkstk_2 Memcheck:Addr4 fun:_chkstk } { visual_c_ignore_bad_typeid Memcheck:Cond fun:??0bad_typeid@@QAE@ABV0@@Z } # and pulseaudio?? possible bad stack from valgrind? { fixme_pulseaudio_leak_widOpen Memcheck:Leak fun:calloc ... fun:pa_cvolume_set } { fixme_pulseaudio_leak_pa_mainloop_dispatch Memcheck:Leak fun:calloc fun:pa_xmalloc0 obj:/usr/lib32/libpulse.so.0.7.1 obj:/usr/lib32/libpulse.so.0.7.1 obj:/usr/lib32/libpulse.so.0.7.1 obj:/usr/lib32/libpulse.so.0.7.1 obj:/usr/lib32/libpulse.so.0.7.1 obj:/usr/lib32/libpulse.so.0.7.1 obj:/usr/lib32/libpulse.so.0.7.1 obj:/usr/lib32/libpulse.so.0.7.1 fun:pa_mainloop_dispatch } # and msacm32? possible bad stack from valgrind? { fixme_msacm32_leak Memcheck:Leak fun:calloc obj:* fun:acmDriverRemove obj:* fun:acmFilterTagDetailsW } { fixme_msacm32_leak2 Memcheck:Leak fun:calloc fun:attr_copy_file ... fun:widReset } # Seen in chromium's EmfTest { fixme_msacm32_leak3 Memcheck:Leak fun:calloc obj:* fun:wodPrepare obj:* fun:wodMapperReconfigure } # aw, heck, sometimes the symbols aren't there? { msacm_leaks_no_symbols Memcheck:Leak fun:calloc obj:* obj:*msacm32.drv.so } # shell32 isn't freeing its imagelist cache on unload? { wine_bug_20544 Memcheck:Leak fun:malloc fun:XInitExtension fun:XextAddDisplay fun:* fun:XShmQueryVersion fun:X11DRV_CreateDIBSection fun:CreateDIBSection fun:ImageList_CreateImage fun:ImageList_Create fun:SIC_Initialize fun:DllMain } # winmm isn't freeing everything on unload? { wine_bug_20545 Memcheck:Leak ... fun:Rtl*AllocateHeap fun:MMDRV_InitPerType fun:MMDRV_Install fun:MMDRV_Init } { # This one's probably benign? user32_builtin_classes_leak Memcheck:Leak fun:calloc fun:XAddExtension fun:_XcursorGetDisplayInfo fun:XcursorSupportsARGB fun:XcursorNoticeCreateBitmap fun:_XNoticeCreateBitmap fun:XCreatePixmap fun:X11DRV_BITMAP_Init fun:device_init fun:X11DRV_CreateDC fun:CreateDCW fun:CURSORICON_CreateIconFromBMI fun:CreateIconFromResourceEx fun:CURSORICON_Load fun:LoadImageW fun:LoadImageA fun:LoadCursorA fun:register_builtin fun:CLASS_RegisterBuiltinClasses } # yet another leak on unload, seen on chromium's net http and ftp tests { wine_bug_20549 Memcheck:Leak fun:malloc ... fun:SECUR32_initSchannelSP } { # yet another gnutls leak? gnutls_leak_bug_2 Memcheck:Leak fun:calloc ... # fun:_gnutls_hash_init (commented out because sometimes this shows up without symbols) # fun:gnutls_handshake fun:schan_InitializeSecurityContextW fun:InitializeSecurityContextW } # leak on thread creation? { wine_bug_20552 Memcheck:Leak ... fun:RtlAllocateHeap fun:alloc_thread_tls fun:MODULE_DllThreadAttach } { wine_secur32_ignore_fork_helper_leak Memcheck:Leak ... fun:RtlAllocateHeap fun:fork_helper fun:SECUR32_initNTLMSP } { wine_bug_20548_ConnectNamedPipe Memcheck:Leak ... fun:RtlAllocateHeap fun:server_ioctl_file fun:NtFsControlFile } { wine_bug_20548_ReadFile Memcheck:Leak ... fun:RtlAllocateHeap fun:NtReadFile } { wine_bug_20548_WriteFile Memcheck:Leak ... fun:RtlAllocateHeap fun:NtWriteFile } { wine_bug_20548_WS_shutdown Memcheck:Leak ... fun:RtlAllocateHeap fun:WS2_register_async_shutdown fun:WS_shutdown } { todo_tls_leak_wine_bug_20552 Memcheck:Leak ... fun:RtlAllocateHeap fun:alloc_thread_tls fun:MODULE_DllThreadAttach fun:start_thread } { wine_bug_20654 Memcheck:Leak ... fun:RtlAllocateHeap fun:get_full_path_helper fun:RtlGetFullPathName_U } { # This leak is expected - wine doesn't have a reliable way to free the default provider on exit. wine_bug_20679 Memcheck:Leak ... fun:CRYPT_GetDefaultProvider } { # Benign window title leak? wine_bug_20692_wontfix Memcheck:Leak ... fun:DEFWND_SetText* ... fun:CreateWindow* } { wine_bug_21045 Memcheck:Leak fun:RtlAllocateHeap fun:SECUR32_addPackages fun:SECUR32_initNegotiateSP } { expected_double_free_wintrust_tests_crypt Memcheck:Addr4 fun:CryptCATAdminReleaseContext fun:test_context fun:func_crypt fun:run_test fun:main } { expected_bad_pointer_wininet_tests_http Memcheck:Addr1 fun:HttpOpenRequestA fun:test_bogus_accept_types_array fun:func_http fun:run_test fun:main } { expected_use_after_free_user32_tests_dialog Memcheck:Addr4 fun:DIALOG_CreateIndirect fun:DialogBoxParamA fun:test_DialogBoxParamA fun:func_dialog fun:run_test fun:main } { expected_12345678_ptr_user32_tests_class Memcheck:Addr2 fun:RtlImageNtHeader fun:RtlImageDirectoryEntryToData fun:find_entry fun:LdrFindResource_U fun:find_resourceA fun:FindResourceExA fun:FindResourceA fun:LoadMenuA fun:WIN_CreateWindowEx fun:CreateWindowExA fun:check_instance_ fun:test_instances fun:func_class fun:run_test fun:main } { expected_advapi32_tests_crypt_badparams Memcheck:Addr4 ... fun:test_incorrect_api_usage fun:func_crypt fun:run_test fun:main } { # These aren't even in wine, but in a helper app wine runs ntlm_auth_leaks Memcheck:Leak ... obj:/usr/bin/ntlm_auth } { ntlm_auth_leaks Memcheck:Leak ... fun:poptGetNextOpt fun:main } { expected_wininet_tests_http_test_bogus_accept_types_array Memcheck:Addr1 fun:HttpOpenRequestA fun:test_bogus_accept_types_array fun:func_http fun:run_test fun:main } { expected_advapi32_tests_crypt_see_wine_bug_20918 Memcheck:Addr4 fun:* fun:test_incorrect_api_usage fun:func_crypt fun:run_test fun:main } { expected_crypt32_tests_crypt_see_wine_bug_20984 Memcheck:Leak fun:notify_alloc fun:RtlAllocateHeap fun:new_object fun:new_key fun:import_public_key fun:import_key fun:RSAENH_CPImportKey fun:CryptImportKey fun:CRYPT_ImportRsaPublicKeyInfoEx fun:CryptImportPublicKeyInfoEx fun:CryptImportPublicKeyInfo fun:CDecodeSignedMsg_VerifySignatureWithKey fun:CDecodeSignedMsg_VerifySignature fun:CDecodeMsg_Control fun:CryptMsgControl fun:CryptVerifyDetachedMessageSignature fun:test_verify_detached_message_signature }