# There are three kinds of suppressions in this file:
# 1. Third party stuff we have no control over.
#
# 2. Intentional unit test errors, stuff that is somehow a false positive
# in our own code, or stuff that is so trivial it's not worth fixing.
#
# 3. Suppressions for real chromium bugs that are not yet fixed.
# These should all be in chromium'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 stuff we have no control over.
{
   FIXME mac kevent libevent probably needs valgrind hooks
   Memcheck:Param
   kevent(changelist)
   fun:kevent
   fun:event_base_new
}
{
   # CoreAudio leak.  See http://crbug.com/9351
   bug_9351
   Memcheck:Leak
   ...
   fun:_ZN12HALCADClient19AddPropertyListenerE*26AudioObjectPropertyAddressP*
   ...
   fun:_ZN9HALSystem16CheckOutInstanceEv
   ...
}
{
   bug_18215
   Memcheck:Uninitialized
   fun:_DPSNextEvent
   fun:-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
   fun:-[NSApplication run]
}
{
   # Also filed with Apple as rdar://7255382
   bug_20459b
   Memcheck:Leak
   fun:malloc_zone_malloc
   fun:_CFRuntimeCreateInstance
   fun:__CFArrayInit
   fun:CFArrayCreateMutableCopy
   ...
   fun:_ZN8Security12KeychainCore5Trust8evaluate*
}
{
   # See also http://openradar.appspot.com/radar?id=1169404
   bug_79533b
   Memcheck:Uninitialized
   ...
   fun:_Z*19cssm_DataAbortQuery17cssm_dl_db_handlel
   fun:CSSM_DL_DataAbortQuery
   fun:_ZN11SSDLSession14DataAbortQueryEll
   fun:_Z*19cssm_DataAbortQuery17cssm_dl_db_handlel
   fun:CSSM_DL_DataAbortQuery
   fun:tpDbFindIssuerCrl
   fun:tpVerifyCertGroupWithCrls
}
{
   # QTKit leak. See http://crbug.com/100772 and rdar://10319535.
   bug_100772
   Memcheck:Leak
   fun:calloc
   fun:QTMLCreateMutex
   fun:WarholCreateGlobals
   fun:INIT_QuickTimeLibInternal
   fun:pthread_once
   fun:INIT_QuickTimeLib
   fun:EnterMovies_priv
   fun:EnterMovies
   fun:TundraUnitInputFromTSFileEntry
   fun:TundraUnitVDIGInputEntry
   fun:TundraUnitCreateFromDescription
   fun:+[QTCaptureVDIGDevice _refreshDevices]
   fun:+[QTCaptureVDIGDevice devicesWithIOType:]
   fun:+[QTCaptureDevice devicesWithIOType:]
   fun:+[QTCaptureDevice inputDevices]
   fun:+[QTCaptureDevice inputDevicesWithMediaType:]
   ...
}
{
   # See http://crbug.com/385604
   bug_385604_a
   Memcheck:Leak
   fun:_Znw*
   fun:_ZNK11AEEventImpl9duplicateEv
   fun:AESendMessage
   fun:_ZL35HIToolboxLSNotificationCallbackFunc18LSNotificationCodedPKvPK7__LSASNS1_11LSSessionIDS1_
   fun:_ZL48LSScheduleNotificationReceiveMessageCallbackFuncP12__CFMachPortPvlS1_
   fun:__CFMachPortPerform
   fun:__CFRunLoopRun
   ...
}
# Intentional leaks in AppKit, for an OS-level cache. Only appear on the first
# run of each reboot.  See also issues 105525, 257276, 340847.
{
   bug_257276_b
   Memcheck:Leak
   fun:malloc_zone_malloc
   ...
   fun:setCursorFromBundle
   fun:CoreCursorSet
   fun:-[NSCursor set]
}
{
   bug_379331
   Memcheck:Uninitialized
   fun:x_zone_size
   fun:find_registered_purgeable_zone
   fun:malloc_make_purgeable
   ...
   fun:setCursorFromBundle
   fun:CoreCursorSet
   fun:-[NSCursor set]
   fun:_ZN12_GLOBAL__N_116ForceSystemLeaksEv
}
{
   FIXME initImagePng leaks from an unknown module
   Memcheck:Leak
   fun:malloc_zone_malloc
   fun:_CFRuntimeCreateInstance
   fun:CFNumberCreate
   fun:get_colorspace
   fun:initImagePng
   obj:*
   obj:/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/ImageIO
   obj:/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
}

# 2. Intentional unit test errors, stuff that is somehow a false positive
# in our own code, or stuff that is so trivial it's not worth fixing.
{
   # Mac Sandbox test cases are registered in a global map.  This code is only
   # used in the unit test binary.
   Mac_Sandbox_Intentional_Leak1
   Memcheck:Leak
   fun:_Znw*
   fun:_ZN7content8internal19RegisterSandboxTestINS_*
   ...
   fun:_ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE
   fun:_ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEj
   fun:_ZN11ImageLoader15runInitializersERKNS_11LinkContextE
   fun:_ZN4dyld24initializeMainExecutableEv
}
{
   # __cxa_get_globals leaks a structure when called for the first time
   __cxa_get_globals one-time leak
   Memcheck:Leak
   ...
   fun:__cxa_get_globals
}

# 3. Suppressions for real chromium bugs that are not yet fixed.
{
   bug_87629
   Memcheck:Leak
   ...
   fun:realloc
   fun:new_sem_from_pool
}
{
   bug_93932_a
   Memcheck:Overlap
   fun:memcpy
   fun:vp8_decode_update_thread_context
   fun:update_context_from_thread
   ...
   fun:ff_thread_decode_frame
   fun:avcodec_decode_video2
   fun:_ZN5media23FFmpegVideoDecodeEngine6DecodeERK13scoped_refptrINS_6BufferEEPS1_INS_10VideoFrameEE
   fun:_ZN5media18FFmpegVideoDecoder14DoDecodeBufferERK13scoped_refptrINS_6BufferEE
}
{
   bug_93932_b
   Memcheck:Overlap
   fun:memcpy
   fun:vp8_decode_update_thread_context
   fun:update_context_from_thread
   fun:frame_thread_free
   fun:avcodec_close
   ...
   fun:_ZN5media23FFmpegVideoDecodeEngineD0Ev
   fun:_ZN10scoped_ptrIN5media23FFmpegVideoDecodeEngineEE5resetEPS1_
   fun:_ZN5media27FFmpegVideoDecodeEngineTestD2Ev
   fun:_ZN5media51FFmpegVideoDecodeEngineTest_DecodeFrame_Normal_TestD0Ev
}
{
   bug_159190
   Memcheck:Uninitialized
   ...
   fun:_ZNK19TConcreteFontScaler15CopyGlyphBitmapEtjP6CGRectPm
   ...
   fun:_ZN9Offscreen5getCGERK19SkScalerContext_MacRK7SkGlyphtPmb
   fun:_ZN19SkScalerContext_Mac13generateImageERK7SkGlyph
}
{
   bug_173779
   Memcheck:Uninitialized
   ...
   fun:img_data_lock
   fun:CGSImageDataLock
   fun:ripc_AcquireImage
   fun:ripc_DrawImage*
   fun:CGContextDrawImage*
   ...
   fun:_ZN11CUIRenderer4DrawE6CGRectP9CGContextPK14__CFDictionaryPS5_
}
{
  bug_340726
  Memcheck:Leak
  fun:_Znw*
  fun:_ZN4base17LoadNativeLibrary*
  fun:_ZN3gfx26InitializeStaticGLBindings*
  fun:_ZN3gfx9GLSurface30InitializeOneOffImplementation*
  fun:_ZN3gfx9GLSurface24InitializeOneOffForTestsEv
}
{
   bug_380568
   Memcheck:Leak
   fun:calloc
   fun:_internal_class_createInstanceFromZone
   ...
   fun:NSAllocateObject
   ...
   fun:-[VideoCaptureDeviceQTKit initWithFrameReceiver:]
   fun:_ZN5media21VideoCaptureDeviceMac4InitENS_18VideoCaptureDevice4Name14CaptureApiTypeE
   fun:_ZN5media28VideoCaptureDeviceFactoryMac6CreateERKNS_18VideoCaptureDevice4NameE
   fun:_ZN5media45VideoCaptureDeviceTest_OpenInvalidDevice_Test8TestBodyEv
}
{
   bug_385604_b
   Memcheck:Leak
   fun:calloc
   fun:_ZN18hb_object_header_t6createEj
   fun:_ZL16hb_object_createI9hb_face_tEPT_v
   fun:hb_face_create_for_tables
   fun:_ZN3gfx12_GLOBAL__N_118CreateHarfBuzzFaceEP10SkTypeface
   fun:_ZN3gfx12_GLOBAL__N_118CreateHarfBuzzFontEP10SkTypefacei
   fun:_ZN3gfx18RenderTextHarfBuzz8ShapeRunEPNS_8internal15TextRunHarfBuzzE
   fun:_ZN3gfx18RenderTextHarfBuzz12EnsureLayoutEv
   fun:_ZN3gfx41RenderTextTest_HarfBuzz_RunDirection_Test8TestBodyEv
}
{
   bug_431906
   Memcheck:Leak
   fun:_Znw*
   fun:_ZN7content21PluginLoaderPosixTestC2Ev
   fun:_ZN7content45PluginLoaderPosixTest_PluginLaunchFailed_TestC2Ev
   fun:_ZN7content45PluginLoaderPosixTest_PluginLaunchFailed_TestC1Ev
   fun:_ZN7testing8internal15TestFactoryImplIN7content45PluginLoaderPosixTest_PluginLaunchFailed_TestEE10CreateTestEv
}
{
   bug_437807
   Memcheck:Leak
   ...
   fun:_ZN4base3mac30PathForFrameworkBundleResourceEPK10__CFString
   fun:_ZN3gin13IsolateHolder14LoadV8SnapshotEv
}
