
# Suppressions for Darwin 10.x / Mac OS X 10.6 Snow Leopard

##----------------------------------------------------------------------##
# Memcheck
##----------------------------------------------------------------------##

# afaict this is legit.  Might be caused by setenv("VAR=")
# where the value string is empty (not sure)
{
   macos-Cond-7
   Memcheck:Cond
   fun:__setenv
}

# From Jesse Ruderman.
{
   Mac OS X 10.6.4. rdar://8145289. "new[]" paired with "delete" in the DesktopServicesPriv framework.
   Memcheck:Free
   fun:_ZdlPv
   fun:_ZN5TChar18RemovePtrReferenceEv
 }

# From Jesse Ruderman.
{
   Mac OS X 10.6.4. rdar://8145318. Uninitialized memory from HIMenuBarView::MeasureAppMenus is used in HIMenuBarView::SetAdjustTextTitleBoundsAtIndex.
   Memcheck:Cond
   fun:_ZN13HIMenuBarView31SetAdjustTextTitleBoundsAtIndexEih
   fun:_ZN13HIMenuBarView15MeasureAppMenusEv
}

{
   TFontFeatures::TFontFeatures(CGFont*) (in CoreText.framework)
   Memcheck:Cond
   fun:_ZN13TFontFeaturesC2EP6CGFont
   fun:_ZNK9TBaseFont12CopyFeaturesEv
}

# See https://bugs.kde.org/show_bug.cgi?id=188572 about this;  it's
# unavoidable due to BSD setenv() semantics.
{
   macos-__setenv-leak-see-our-bug-188572
   Memcheck:Leak
   fun:malloc_zone_malloc
   fun:__setenv
}

{
   libSystem-keymgr-leak-at-exit
   Memcheck:Leak
   fun:malloc
   fun:get_or_create_key_element
   fun:_keymgr_get_and_lock_processwide_ptr_2
   fun:__keymgr_initializer
   fun:libSystem_initializer
}

{
   darwin-still-reachable-1
   Memcheck:Leak
   ...
   fun:dwarf2_unwind_dyld_add_image_hook
   fun:_ZN4dyld19registerAddCallbackEPFvPK11mach_headerlE
   fun:_dyld_register_func_for_add_image
   fun:__keymgr_initializer
   fun:libSystem_initializer
}
