
# Suppressions for Darwin 11.x / Mac OS X 10.7 Lion

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

# Dunno where this is a real bug, or due to borked 10.7-specific syscall
# wrappers.  64-bit mode; not sure if occurs in 32-bit mode. 
# Anyway, for the tine being:
#
# Conditional jump or move depends on uninitialised value(s)
#    at 0x1973E6: __mtx_droplock (in /usr/lib/system/libsystem_c.dylib)
#    by 0x1976AA: pthread_mutex_unlock (in /usr/lib/system/libsystem_c.dylib)
#    by 0x100B3D: unlock_node (in /usr/lib/system/libkeymgr.dylib)
{
   OSX107:__mtx_droplock
   Memcheck:Cond
   fun:__mtx_droplock
   fun:pthread_mutex_unlock
   fun:unlock_node
}

# Conditional jump or move depends on uninitialised value(s)
#    at 0x2EB883: ??? (in /usr/lib/system/libxpc.dylib)
#    by 0x237C6: ??? (in /usr/lib/libSystem.B.dylib)
#    by 0x8FE1115A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
{
   <insert_a_suppression_name_here>
   Memcheck:Cond
   obj:/usr/lib/system/libxpc.dylib
   obj:/usr/lib/libSystem.B.dylib
   fun:_ZN16ImageLoaderMachO18doModInitFunctionsERKN11ImageLoader11LinkContextE
}

# ZLib stuff.  How come this wasn't necessary in 10.6 ?
{
   OSX107:zlib-C
   Memcheck:Cond
   obj:/usr/lib/libz.*dylib
   obj:/usr/lib/libz.*dylib
}
{
   OSX107:zlib-8
   Memcheck:Value8
   obj:/usr/lib/libz.*dylib
   obj:/usr/lib/libz.*dylib
}

# Really a bug?  I don't know.
# Conditional jump or move depends on uninitialised value(s)
#    at 0x3A322FE: __mtx_droplock (in /usr/lib/system/libsystem_c.dylib)
#    by 0x3A326AA: pthread_mutex_unlock (in /usr/lib/system/libsystem_c.dylib)
#    by 0x26382: load_images (in /usr/lib/libobjc.A.dylib)
{
   OSX107:blah
   Memcheck:Cond
   fun:__mtx_droplock
   fun:pthread_mutex_unlock
}

{
   OSX107:blah
   Memcheck:Cond
   fun:pthread_mutex_lock
}

################
# More OSX 10.7.2 supps from startup of Firefox, for reports
# that look like they are in the OSX system libraries

# Conditional jump or move depends on uninitialised value(s)
#    at 0x65ADC41: TParsingContext::BuildMacEncTable()
#    by 0x65AD98B: TParsingContext::GetEncHash(char const*)
#  Uninitialised value was created by a heap allocation
#    at 0xC743: malloc (vg_replace_malloc.c:266)
#    by 0x65ADADA: TParsingContext::BuildMacEncTable()
{
   OSX107:more1
   Memcheck:Cond
   fun:*TParsingContext16BuildMacEncTable*
   fun:*TParsingContext10GetEncHash*
}

# Conditional jump or move depends on uninitialised value(s)
#    at 0x49ABC48: CGColorSpaceAdjustColor
#    by 0x4A9AEE8: CGGradientCreateWithColorComponents
#  Uninitialised value was created by a heap allocation
#    at 0xC743: malloc (vg_replace_malloc.c:266)
#    by 0x4A9AEC4: CGGradientCreateWithColorComponents
#    by 0x4A9AC49: CGGradientCreateWithColors
{
   OSX107:more2
   Memcheck:Cond
   fun:CGColorSpaceAdjustColor
   fun:CGGradientCreateWithColorComponents
}


# Conditional jump or move depends on uninitialised value(s)
#    at 0x2119CCA8: BitSetNextSetBit
#    by 0x211A4BA5: BuildInterferenceSets
#  Uninitialised value was created by a heap allocation
#    at 0xC743: malloc (vg_replace_malloc.c:266)
#    by 0x2119CB98: BitSetNew
#    by 0x2119D06F: BuildGenKill
{
   OSX107:more3
   Memcheck:Cond
   fun:BitSetNextSetBit
   fun:BuildInterferenceSets
}

# and similar
{
   OSX107:more4
   Memcheck:Cond
   fun:BitSetNextSetBit
   fun:RegistersReInterfere
}


# Conditional jump or move depends on uninitialised value(s)
#    at 0x33E4160: CUIRenderer::CreateImage
#    by 0x33C14A4: CUIRenderer::DrawMenuBar
#  Uninitialised value was created by a stack allocation
#    at 0x33C12FC: CUIRenderer::DrawMenuBar
{
   OSX107:more5
   Memcheck:Cond
   fun:*CUIRenderer*CreateImage*
   fun:*CUIRenderer*DrawMenu*
}

# and similar
{
   OSX107:more6
   Memcheck:Cond
   fun:floor$fenv_access_off
   fun:*CUIRenderer*CreateImage*
   fun:*CUIRenderer*DrawMenu*
}

# This appears a lot, and the origins seem either missing or
# from system libs.
# Use of uninitialised value of size 8
#    at 0x39CC164: aes_encrypt_xmm_no_save
{
   OSX107:more7
   Memcheck:Value8
   fun:aes_encrypt_xmm_no_save
}


# Conditional jump or move depends on uninitialised value(s)
#    at 0xD6D193: -[NSPersistentUIManager writeWindowSnapshot:length:...
#    by 0xD71A03: __-[NSPersistentUIManager _updateSnapshotForWindowN...
{
   OSX107:more8
   Memcheck:Cond
   fun:-[NSPersistentUIManager?writeWindowSnapshot*
   fun:__-[NSPersistentUIManager?_updateSnapshotForWindowNumber*
}


##########################################################################
### The ones below are from darwin10.supp (for Snow Leopard).  I don't
### know whether they are still necessary.

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

# From Gary Kwong
{
   macos-malloc_set_zone_name-see-our-bug-307557
   Memcheck:Leak
   fun:malloc_zone_malloc
   ...
   fun:malloc_set_zone_name
   ...
   fun:init__zone0
}
