# 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_get_slave
   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
 }
