
##----------------------------------------------------------------------##

# Errors to suppress by default with XFree86 4.1.0)

# Format of this file is:
# {
#     name_of_suppression
#     tool_name:supp_kind
#     (optional extra info for some suppression types)
#     caller0 name, or /name/of/so/file.so
#     caller1 name, or ditto
#     (optionally: caller2 name)
#     (optionally: caller3 name)
#  }
#
# For memcheck, the supp_kinds are:
#
#     Param Value1 Value2 Value4 Value8 Value16
#     Free Addr1 Addr2 Addr4 Addr8 Addr16
#     Cond (previously known as Value0)
#
# and the optional extra info is:
#     if Param: name of system call param
#     if Free: name of free-ing fn)

# Resulting from R H 8.0
{
   *libc_write/libX11.so.6.2/*X11TransWrite(Param)
   Addrcheck,Memcheck:Param
   write(buf)
   fun:*libc_write
   obj:/usr/X11R6/lib*/libX11.so.6.2
   fun:*X11TransWrite
}

{
   libX11.so.6.2/libX11.so.6.2/libX11.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libX11.so.6.2
}

{
   libXt.so.6.2/libXt.so.6.2/libXt.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
}


{
   libXaw.so.7.0/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libXmu.so.6.2/libXmu.so.6.2/libXmu.so.6.2(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXmu.so.6.2
   obj:/usr/X11R6/lib*/libXmu.so.6.2
   obj:/usr/X11R6/lib*/libXmu.so.6.2
}

{
   libXt.so.6.0/libXt.so.6.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Value4)
   Memcheck:Value4
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
}

{
   libXaw.so.7.0/libXaw.so.7.0/libXt.so.6.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXt.so.6.0
}

{
   libX11.so.6.2/libX11.so.6.2/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libX11.so.6.2/libXaw.so.7.0/libXaw.so.7.0(Cond)
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libX11.so.6.2
   obj:/usr/X11R6/lib*/libXaw.so.7.0
   obj:/usr/X11R6/lib*/libXaw.so.7.0
}

{
   libXpm.so.4.11/libXpm.so.4.11/libXpm.so.4.11
   Memcheck:Cond
   obj:/usr/X11R6/lib*/libXpm.so.4.11
   obj:/usr/X11R6/lib*/libXpm.so.4.11
   obj:/usr/X11R6/lib*/libXpm.so.4.11
}

{
   struct with uninitialized paddings
   Memcheck:Param
   writev(vector[...])
   fun:*_writev
   fun:_X11TransSocketWritev
   fun:_X11TransWritev
   fun:*
}

{
   another struct with uninitialized paddings
   Memcheck:Param
   write(buf)
   fun:*
   fun:_IceTransSocketWrite
   fun:_IceTransWrite
   fun:_IceWrite
}

{
   Xorg 6.8.1 uninit _write* padding
   Memcheck:Param
   write(buf)
   fun:*
   fun:_X11TransWrite
   obj:/usr/X11R6/lib*/libX11.so.6.2
}

{
   Xorg 6.8.1 uninit write padding
   Memcheck:Param
   write(buf)
   fun:write
   fun:_X11TransWrite
   obj:/usr/X11R6/lib*/libX11.so.6.2
}

{
   Xorg 6.8.1 ICE uninit __write* padding
   Memcheck:Param
   write(buf)
   fun:__write*
   fun:_IceTransWrite
   fun:_IceWrite
   fun:IceFlush
}

{
   Xorg 6.8.1 ICE uninit write padding
   Memcheck:Param
   write(buf)
   fun:write
   fun:_IceTransWrite
   fun:_IceWrite
   fun:IceFlush
}

{
   Xorg 6.8.1 writev uninit padding
   Memcheck:Param
   writev(vector[...])
   fun:writev
   obj:/usr/X11R6/lib*/libX11.so.6.2
   fun:_X11TransWritev
   fun:_XSend
}

##----------------------------------------------------------------------##

