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

# Errors to suppress by default on a Linux kernel 2.4 system
# (glibc 2.2.4, 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)

# even more glibc suppressions ?
{
   libc-2.2.4.so/libc-2.2.4.so/libc-2.2.4.so(Cond)
   memcheck:Cond
   obj:*libc-2.2.4.so
   obj:*libc-2.2.4.so
   obj:*libc-2.2.4.so
}
{
   libc-2.2.4.so/libc-2.2.4.so/libc-2.2.4.so(Value4)
   memcheck:Value4
   obj:*libc-2.2.4.so
   obj:*libc-2.2.4.so
   obj:*libc-2.2.4.so
}

##### glibc 2.2.5 stuff perhaps?
##### suppressions for coolo
{
   strchr/dl_open_worker(Cond)
   Memcheck:Cond
   fun:strchr
   fun:dl_open_worker
}
{ 
   __rawmemchr/internal_getgrgid_r(Cond)
   Memcheck:Cond 
   fun:__rawmemchr
   fun:internal_getgrgid_r
} 
{ 
   _IO_vfprintf/__strnlen(Cond)
   Memcheck:Cond 
   fun:__strnlen
   fun:_IO_vfprintf
} 
{ 
   __strchrnul/gethostbyname*(Cond)
   Memcheck:Cond 
   fun:__strchrnul
   fun:gethostbyname*
} 


##----
{
   strlen/*dl_map_object*(Cond)
   Memcheck:Cond
   fun:strlen
   fun:*dl_map_object*
}

{
   strlen/*dl_open_worker*(Cond)
   Memcheck:Cond
   fun:strlen
   fun:*dl_open_worker*
}

{
   *rawmemchr*/*nss*(Cond)
   Memcheck:Cond
   fun:*rawmemchr*
   fun:*nss*
}

{
   *strchrnul*/*nss*(Cond)
   Memcheck:Cond
   fun:*strchrnul*
   fun:*nss*
}



# gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)
# on Red Hat 7.2 (x86) miscompiles __mpn_construct_double in
# __mpn_construct_double (../sysdeps/ieee754/dbl-64/mpn2dbl.c:45)
# (glibc-2.2.4) to read and write below %esp.  Hence the following
# two:
{
   __mpn_construct_double/*(Addr4)
   Addrcheck,Memcheck:Addr4
   fun:__mpn_construct_double
   fun:*
}
{
   __mpn_construct_double/*(Addr8)
   Addrcheck,Memcheck:Addr8
   fun:__mpn_construct_double
   fun:*
}

# More of the same (gcc bug, I'm pretty sure)
{
   __fabs/*(Addr4)
   Addrcheck,Memcheck:Addr4
   fun:__fabs
   fun:*
}
{
   __fabs/*(Addr8)
   Addrcheck,Memcheck:Addr8
   fun:__fabs
   fun:*
}


# Not sure what this is about ... but anyway
{
   pthread_sighandler/*(Addr4)
   Addrcheck,Memcheck:Addr4
   fun:pthread_sighandler
   fun:*
}


# More glibc stuff, AFAICS

{
   __strnlen/__argz_stringify/_nl_make_l10nflist(Cond)
   Memcheck:Cond
   fun:__strnlen
   fun:__argz_stringify
   fun:_nl_make_l10nflist
}

#--------------
{
   _dl_relocate_object/dl_open_worker/_dl_catch_error(Cond)
   Memcheck:Cond
   fun:_dl_relocate_object
   fun:dl_open_worker
   fun:_dl_catch_error
}
{
   _dl_relocate_object/libc-2.2.4.so/_dl_catch_error(Cond)
   Memcheck:Cond
   fun:_dl_relocate_object
   obj:*libc-2.2.4.so
   fun:_dl_catch_error
}

{
   strrchr/_dl_map_object_from_fd/_dl_map_object(Cond)
   Memcheck:Cond
   fun:strrchr
   fun:_dl_map_object_from_fd
   fun:_dl_map_object
}

#-------------------
{
   socketcall.connect(serv_addr)/__libc_connect/*
   Addrcheck,Memcheck:Param
   socketcall.connect(serv_addr)
   fun:__libc_connect
   fun:*
}
{
   socketcall.connect(serv_addr)/libc-2.2.4.so/libc-2.2.4.so
   Addrcheck,Memcheck:Param
   socketcall.connect(serv_addr)
   obj:*libc-2.2.4.so
   obj:*libc-2.2.4.so
}

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

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

#----------------------
{
   write(buf)/__libc_write/libX11.so.6.2/libX11.so.6.2(Param)
   Addrcheck,Memcheck:Param
   write(buf)
   fun:__libc_write
   obj:/usr/X11R6/lib/libX11.so.6.2
   obj:/usr/X11R6/lib/libX11.so.6.2
}
{
   write(buf)/libc-2.2.4.so/libX11.so.6.2/libX11.so.6.2(Param)
   Addrcheck,Memcheck:Param
   write(buf)
   obj:*libc-2.2.4.so
   obj:/usr/X11R6/lib/libX11.so.6.2
   obj:/usr/X11R6/lib/libX11.so.6.2
}

#{
#   llseek(result)/__libc_lseek64/_IO_file_seek(Param)
#   Addrcheck,Memcheck:Param
#   llseek(result)
#   fun:__libc_lseek64
#   fun:_IO_file_seek
#}

{
   writev(vector[...])/__writev/libX11.so.6.2/libX11.so.6.2
   Addrcheck,Memcheck:Param
   writev(vector[...])
   fun:__writev
   obj:/usr/X11R6/lib/libX11.so.6.2
   obj:/usr/X11R6/lib/libX11.so.6.2
}

#----------------
{
   __rawmemchr/libXt.so.6.0/libXt.so.6.0
   Memcheck:Cond
   fun:__rawmemchr
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}
{
   libc-2.2.4.so/libXt.so.6.0/libXt.so.6.0
   Memcheck:Cond
   obj:*libc-2.2.4.so
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}

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

