# There are three kinds of suppressions in this file.
# 1. Third party leaks we have no control over.
#
# 2. Intentional unit test errors, false positives
# in our own code, or leaks that are so trivial they are not worth fixing.
#
# 3. Suppressions for real WebKit bugs that are not yet fixed.
# These should all be in webkit's bug tracking system
# Periodically we should sweep this file and the bug tracker clean by
# running overnight and removing outdated bugs/suppressions.
#-----------------------------------------------------------------------

# 1. Third party leaks we have no control over.
{
   # GTK developers don't like cleaning up one-time leaks.
   # See http://mail.gnome.org/archives/gtk-devel-list/2004-April/msg00230.html.
   gtk_init_check (Third Party)
   Memcheck:Leak
   ...
   fun:gtk_init_check
}

{
   FcConfigParseAndLoad (Third Party)
   Memcheck:Leak
   ...
   fun:XML_ParseBuffer
   fun:FcConfigParseAndLoad
}

{
   FcConfigAppFontAddFile (Third Party)
   Memcheck:Leak
   ...
   fun:FcConfigAppFontAddFile
}

{
   # See also http://www.gnome.org/~johan/gtk.suppression
   # (which has a smattering of similar pango suppressions).
   FcFontRenderPrepare 1 (Third Party)
   Memcheck:Leak
   ...
   fun:FcFontRenderPrepare
   obj:*
   fun:pango_font_map_load_fontset
}

{
   FcFontRenderPrepare 2 (Third Party)
   Memcheck:Leak
   ...
   fun:FcFontRenderPrepare
   ...
   fun:pango_itemize_with_base_dir
}

{
   FcFontRenderPrepare 3 (Third Party)
   Memcheck:Leak
   ...
   fun:FcFontRenderPrepare
   ...
   fun:pango_ot_buffer_output
}

{
   FcFontRenderPrepare 4 (Third Party)
   Memcheck:Leak
   ...
   fun:FcFontRenderPrepare
   ...
   fun:pango_context_get_metrics
}

{
   FcDefaultSubstitute (Third Party)
   Memcheck:Leak
   ...
   fun:FcDefaultSubstitute
   ...
   fun:pango_itemize_with_base_dir
}

{
   # Reported in https://bugs.freedesktop.org/show_bug.cgi?id=8215.
   FcPatternObjectInsertElt 1 (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:FcPatternObjectInsertElt
   fun:FcPatternObjectAddWithBinding
}

{
   # See https://bugs.freedesktop.org/show_bug.cgi?id=8428.
   # and http://www.gnome.org/~johan/gtk.suppression.
   FcPatternObjectInsertElt 2 (Third Party)
   Memcheck:Leak
   ...
   fun:realloc
   fun:FcPatternObjectInsertElt
}

{
   FcConfigValues (Third Party)
   Memcheck:Leak
   ...
   fun:malloc
   fun:FcConfigValues
   fun:FcConfigValues
   ...
   fun:FcConfigValues
   fun:FcConfigValues
}

{
   FcCharSetSort (Third Party)
   Memcheck:Leak
   ...
   fun:FcFontSetSort
   fun:FcFontSort
}

{
   FcCharSetAddChar (Third Party)
   Memcheck:Leak
   ...
   fun:FcCharSetFindLeafCreate
   fun:FcCharSetAddChar
}

{
   pango_script_get_sample_language (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_strdup
   fun:pango_script_get_sample_language
   ...
   fun:pango_font_get_metrics
}

{
   # See http://sourceware.org/bugzilla/show_bug.cgi?id=12878.
   dlopen (Third Party)
   Memcheck:Leak
   fun:calloc
   fun:_dlerror_run
   fun:dlopen@@GLIBC_2.1
}

{
   # See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=2451.
   _dl_map_object_from_fd (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:_dl_map_object_from_fd
}

{
   # See http://sources.redhat.com/bugzilla/show_bug.cgi?id=5171
   pthread_create (Third Party)
   Memcheck:Leak
   fun:calloc
   fun:allocate_dtv
   fun:_dl_allocate_tls
   fun:pthread_create@@GLIBC_2.1
}

{
   # See http://sourceware.org/bugzilla/show_bug.cgi?id=14015.
   dlsym (Third Party)
   Memcheck:Leak
   fun:calloc
   fun:_dlerror_run
   fun:dlsym
}

{
   g_object_add_weak_pointer (Third Party)
   Memcheck:Leak
   ...
   fun:g_object_weak_ref
   fun:g_object_add_weak_pointer
}

{
   g_build_filename (Third Party)
   Memcheck:Leak
   fun:realloc
   fun:g_realloc
   fun:g_string_maybe_expand
   fun:g_string_insert_len
   fun:g_build_path_va
   fun:g_build_filename
   fun:_ZL15initializeFontsPKc
}

{
   gtk_im_context_set_client_window (Third Party)
   Memcheck:Leak
   ...
   fun:malloc
   fun:g_malloc
   fun:g_strdup
   fun:gtk_im_multicontext_set_client_window
   fun:gtk_im_context_set_client_window
}

{
   gtk_css_provider_load_from_data (Third Party)
   Memcheck:Leak
   fun:realloc
   fun:g_realloc
   fun:g_string_maybe_expand
   fun:g_string_insert_c
   fun:_gtk_css_parser_read_char
   fun:_gtk_css_parser_try_ident
   fun:bindings_value_parse_one
   fun:_gtk_css_array_value_parse
   fun:gtk_css_provider_load_internal
   fun:gtk_css_provider_load_from_data
}

{
   # GTK leaks an X11 window.
   gdk_x11_drawable_get_xid (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_slice_alloc
   fun:g_slice_alloc0
   fun:g_type_create_instance
   fun:g_object_constructor
   fun:g_object_newv
   fun:g_object_new
   fun:_gdk_window_impl_new
   fun:gdk_window_ensure_native
   fun:gdk_x11_drawable_get_xid
}

{
   # GTK leaks a cairo context (large leak)
   gtk_window_realize (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:_cairo_default_context_create
   fun:set_grip_shape
   fun:resize_grip_create_window
   fun:gtk_window_realize
}

{
   g_quark_from_static_string (Third party)
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_quark_from_static_string
   fun:gobject_init_ctor
   fun:call_init.part.0
   fun:_dl_init
   obj:/lib/x86_64-linux-gnu/ld-2.15.so
   obj:*
   obj:*
   obj:*
}

{
   /bin/bash (Third Party)
   Memcheck:Leak
   ...
   obj:/bin/bash
}

{
   libenchant.so new (Third party)
   Memcheck:Leak
   fun:_Znw*
   ...
   obj:*/libenchant.so.1.6.0
   fun:enchant_broker_dict_exists
}

{
   libenchant.so malloc (Third party)
   Memcheck:Leak
   fun:*alloc
   ...
   obj:*/libenchant.so.1.6.0
   fun:enchant_broker_dict_exists
}

{
   # Cairo leaks a pattern_t* in cairo_set_source_surface
   cairo_set_source_surface (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:cairo_pattern_create_for_surface
   fun:_cairo_default_context_set_source_surface
   fun:cairo_set_source_surface
}

{
   XRRFindDisplay (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:XRRFindDisplay
}
{
   libflashplayer.so (Third Party)
   Memcheck:Leak
   ...
   obj:/usr/lib/flashplugin-installer/libflashplayer.so
}

{
   gdk_init (Third Party)
   Memcheck:Leak
   fun:malloc
   ...
   fun:_nl_find_domain
   fun:__dcigettext
   fun:gdk_screen_class_intern_init
   fun:g_type_class_ref
   fun:g_type_class_ref
   fun:g_object_newv
   fun:g_object_new
   fun:_gdk_x11_screen_new
   fun:gdk_display_open
   fun:gdk_display_open_default_libgtk_only
   fun:gdk_init_check
   fun:gdk_init
}

{
   XKeysymToString (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:XKeysymToString
}

{
   g_thread_proxy (Third Party)
   Memcheck:Leak
   fun:*alloc
   ...
   fun:g_thread_proxy
}

{
   JNI_CreateJavaVM (Third party)
   Memcheck:Leak
   ...
   fun:JNI_CreateJavaVM
   fun:JavaMain
}

{
   _ZL10java_startP6Thread (Third party)
   Memcheck:Leak
   ...
   fun:_ZN8VMThread3runEv
   fun:_ZL10java_startP6Thread
   ...

}

{
   /bin/java (OpenJDK) (Third party)
   Memcheck:Leak
   ...
   obj:/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java
   ...
}

{
   libGL.so (Third party)
   Memcheck:Leak
   ...
   obj:*/libGL.so.*
   ...
}

{
   _cairo_xlib_shm_surface_create.isra.11 (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:_pixman_image_allocate
   fun:pixman_image_create_bits
   fun:_cairo_xlib_shm_surface_create.isra.11
}

{
   __nss_database_lookup (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:nss_parse_service_list
   fun:__nss_database_lookup
   obj:*
}

{
   gst_init_check (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_intern_string
   fun:_priv_gst_registry_chunks_load_plugin
   fun:exchange_packets
   fun:plugin_loader_load
   fun:gst_registry_scan_plugin_file
   fun:gst_registry_scan_path_level
   fun:gst_registry_scan_path_internal
   fun:gst_update_registry
   fun:init_post
   fun:g_option_context_parse
   fun:gst_init_check

}

{
   g_task_run_in_thread (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_slice_alloc
   fun:g_slice_alloc0
   fun:g_system_thread_new
   fun:g_thread_new_internal
   fun:g_thread_pool_start_thread
   fun:g_thread_pool_push
   fun:g_task_start_task_thread
   fun:g_task_run_in_thread
}

{
   # Large leak in cairo_image_surface_create
   _cairo_image_surface_create_with_pixman_format (Third Party)
   Memcheck:Leak
   fun:malloc
   fun:_cairo_image_surface_create_for_pixman_image
   fun:_cairo_image_surface_create_with_pixman_format
   fun:_ZN7WebCore21copyCairoImageSurfaceEP14_cairo_surface
}


#-----------------------------------------------------------------------
# 2. Intentional unit test errors, false positives
# in our own code, or leaks that are so trivial they are not worth fixing.

{
   # According to dglazkov, these are one-time leaks and intentional.
   # They may go away if the change to move these off the heap lands.
   WebCore::SVGNames::init (Intentional)
   Memcheck:Leak
   ...
   fun:_ZN7WebCore8SVGNames4initEv
}

{
   # This is an on demand initialization which is done and then intentionally
   # kept around (not freed) while the process is running.
   WebCore::XMLNames::init (Intentional)
   Memcheck:Leak
   ...
   fun:_ZN7WebCore8XMLNames4initEv
}

{
   # This is WebKit wide theading initialization which is intentionally kept
   # around (not freed) while the process is running.
   WTF::ThreadIdentifierData::initialize() (Intentional)
   Memcheck:Leak
   ...
   fun:_ZN3WTF20ThreadIdentifierData10initializeEj
}

{
   # This is WebKit wide theading initialization which is intentionally kept
   # around (not freed) while the process is running.
   WTF::ThreadData (Intentional)
   Memcheck:Leak
   ...
   fun:_ZN3WTF13wtfThreadDataEv
}

{
   WTF::BitVector (Intentional)
   Memcheck:Leak
   fun:malloc
   fun:_ZN3WTF10fastMallocEm
   fun:_ZN3WTF9BitVector13OutOfLineBits6createEm
   fun:_ZN3WTF9BitVector15resizeOutOfLineEm
   fun:_ZN3WTF9BitVector10ensureSizeEm
   fun:_ZN3WTF9BitVectorC1Em
}

{
   # WTF::ThreadSpecific leaks a few bytes at a time.
   WTF::ThreadSpecific::set() (Intentional)
   Memcheck:Leak
   fun:_Znw*
   fun:_ZN3WTF14ThreadSpecificIbE3setEPb
   fun:_ZN3WTF14ThreadSpecificIbEcvPbEv
   fun:_ZN3WTF14ThreadSpecificIbEdeEv
   fun:_ZN3WTF16registerGCThreadEv
   fun:_ZN3JSC8GCThread12gcThreadMainEv
   fun:_ZN3JSC8GCThread17gcThreadStartFuncEPv
   fun:_ZN3WTFL16threadEntryPointEPv
}

{
   # DOMObjectCache memory is not freed.
   webkit_dom_document_get_default_view (Intentional)
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_slice_alloc
   fun:_ZN6WebKit14DOMObjectCache3putEPvS1_
   fun:_ZL33webkit_dom_dom_window_constructormjP22_GObjectConstructParam
   fun:g_object_newv
   fun:g_object_new_valist
   fun:g_object_new
   fun:_ZN6WebKit13wrapDOMWindowEPN7WebCore9DOMWindowE
   fun:webkit_dom_document_get_default_view
 }

#-----------------------------------------------------------------------
# 3. Suppressions for real webkit bugs that are not yet fixed.
# These should all be in webkit's bug tracking system (but a few aren't yet).

{
   # AtkProperty is cached but not released (see https://bugs.webkit.org/show_bug.cgi?id=118567#c2).
   cacheAndReturnAtkProperty
   Memcheck:Leak
   fun:malloc
   fun:_ZN3WTF10fastMallocEm
   fun:_ZN3WTF13CStringBuffer19createUninitializedEm
   fun:_ZN3WTF7CString4initEPKcm
   fun:_ZN3WTF7CStringC1EPKcm
   fun:_ZNK3WTF6String4utf8ENS0_14ConversionModeE
   fun:cacheAndReturnAtkProperty
}

{
   # AtkRelationSet is never freed because the target AtkObject is
   # cached. See https://bugs.webkit.org/show_bug.cgi?id=118567.
   AccessibilityUIElement::title()
   Memcheck:Leak
   fun:malloc
   ...
   fun:g_object_weak_ref
   fun:atk_relation_set_property
   fun:g_object_newv
   fun:g_object_new_valist
   fun:g_object_new
   fun:atk_relation_new
   fun:atk_relation_set_add_relation_by_type
   fun:_ZL31setAtkRelationSetFromCoreObjectPN7WebCore19AccessibilityObjectEP15_AtkRelationSet
   fun:_ZL30webkitAccessibleRefRelationSetP10_AtkObject
   fun:_ZN22AccessibilityUIElement14titleUIElementEv
}

{
   # Leak in webkitAccessibleNew https://bugs.webkit.org/show_bug.cgi?id=118382
   webkitAccessibleNew
   Memcheck:Leak
   fun:*alloc
   ...
   fun:webkitAccessibleNew
}

{
   # Leak ATK text https://bugs.webkit.org/show_bug.cgi?id=118385
   webkitAccessibleTextGetText
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_strdup
   fun:_ZL27webkitAccessibleTextGetTextP8_AtkTextii
   fun:_ZL23webkitAccessibleGetNameP10_AtkObject
}

{
   # Leak PluginObject in exceptional circumstances https://bugs.webkit.org/show_bug.cgi?id=118528
   WebCore::PluginView::start()
   Memcheck:Leak
   fun:malloc
   fun:_ZL14pluginAllocateP4_NPPP7NPClass
   fun:_NPN_CreateObject
   fun:NPP_New
   fun:_ZN7WebCore10PluginView5startEv
}

{
   Memcheck:Leak
   fun:malloc
   fun:_ZN3WTF10fastMallocEm
   fun:_ZN3WTF10fastStrDupEPKc
   fun:_ZN7WebCore12TextCodecICU14registerCodecsEPFvPKcPFN3WTF10PassOwnPtrINS_9TextCodecEEERKNS_12TextEncodingEPKvESB_E
}

{
   # DumpRenderTree WebKitWebView is leaked
   webViewCreate
   Memcheck:Leak
   fun:malloc
   fun:g_malloc
   fun:g_slice_alloc
   fun:g_slist_prepend
   fun:_ZL13webViewCreateP14_WebKitWebViewP15_WebKitWebFrame
   fun:webkit_marshal_OBJECT__OBJECT
   fun:g_closure_invoke
   fun:signal_emit_unlocked_R
   fun:g_signal_emit_valist
   fun:g_signal_emit_by_name
   fun:_ZN6WebKit12ChromeClient12createWindowEPN7WebCore5FrameERKNS1_16FrameLoadRequestERKNS1_14WindowFeaturesERKNS1_16NavigationActionE
   fun:_ZNK7WebCore6Chrome12createWindowEPNS_5FrameERKNS_16FrameLoadRequestERKNS_14WindowFeaturesERKNS_16NavigationActionE
   fun:_ZN7WebCore12createWindowEPNS_5FrameES1_RKNS_16FrameLoadRequestERKNS_14WindowFeaturesERb
   fun:_ZN7WebCore9DOMWindow12createWindowERKN3WTF6StringERKNS1_12AtomicStringERKNS_14WindowFeaturesEPS0_PNS_5FrameESD_PFvSB_PvESE_
   fun:_ZN7WebCore9DOMWindow4openERKN3WTF6StringERKNS1_12AtomicStringES4_PS0_S8_
   fun:_ZN7WebCore11JSDOMWindow4openEPN3JSC9ExecStateE
   fun:_ZN7WebCore32jsDOMWindowPrototypeFunctionOpenEPN3JSC9ExecStateE
 }
