# 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:_ZN12HALCADClient19AddPropertyListenerEmPK26AudioObjectPropertyAddressPFlmmS2_PvES3_
   ...
   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]
}

# 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:_internal_class_createInstance
   fun:NSAllocateObject
   fun:+[NSObject(NSObject) alloc]
   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_416957
   Memcheck:Leak
   fun:_Znw*
   fun:_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPKN15tracked_objects6BirthsENS3_9DeathDataEEEE8allocateEmPKv
   fun:_ZNSt8_Rb_treeIPKN15tracked_objects6BirthsESt4pairIKS3_NS0_9DeathDataEESt10_Select1stIS7_ESt4lessIS3_ESaIS7_EE11_M_get_nodeEv
   fun:_ZNSt8_Rb_treeIPKN15tracked_objects6BirthsESt4pairIKS3_NS0_9DeathDataEESt10_Select1stIS7_ESt4lessIS3_ESaIS7_EE14_M_create_nodeERKS7_
   fun:_ZNSt8_Rb_treeIPKN15tracked_objects6BirthsESt4pairIKS3_NS0_9DeathDataEESt10_Select1stIS7_ESt4lessIS3_ESaIS7_EE9_M_insertEPSt18_Rb_tree_node_baseSF_RKS7_
   fun:_ZNSt8_Rb_treeIPKN15tracked_objects6BirthsESt4pairIKS3_NS0_9DeathDataEESt10_Select1stIS7_ESt4lessIS3_ESaIS7_EE16_M_insert_uniqueESt17_Rb_tree_iteratorIS7_ERKS7_
   fun:_ZNSt3mapIPKN15tracked_objects6BirthsENS0_9DeathDataESt4lessIS3_ESaISt4pairIKS3_S4_EEE6insertESt17_Rb_tree_iteratorIS9_ERKS9_
   fun:_ZNSt3mapIPKN15tracked_objects6BirthsENS0_9DeathDataESt4lessIS3_ESaISt4pairIKS3_S4_EEEixERS8_
   fun:_ZN15tracked_objects10ThreadData11TallyADeathERKNS_6BirthsEiRKNS_13TaskStopwatchE
   fun:_ZN15tracked_objects10ThreadData31TallyRunOnNamedThreadIfTrackingERKN4base12TrackingInfoERKNS_13TaskStopwatchE
   fun:_ZN4base5debug13TaskAnnotator7RunTaskEPKcS3_RKNS_11PendingTaskE
   fun:_ZN4base11MessageLoop7RunTaskERKNS_11PendingTaskE
   fun:_ZN4base11MessageLoop21DeferOrRunPendingTaskERKNS_11PendingTaskE
   fun:_ZN4base11MessageLoop6DoWorkEv
}

