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

# Errors to suppress by default with glibc 2.2.4

# Format of this file is:
# {
#     name_of_suppression
#     kind: one of Param Value1 Value2 Value4 Value8
#                   Free Addr1 Addr2 Addr4 Addr8
#                   Cond (previously known as Value0)
#     (if Param: name of system call param, if Free: name of free-ing fn)
#     caller0 name, or /name/of/so/file.so
#     caller1 name, or ditto
#     (optionally: caller2 name)
#     (optionally: caller3 name)
#  }


# even more glibc suppressions ?
{
   libc-2.2.4.so/libc-2.2.4.so/libc-2.2.4.so(Cond)
   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)
   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)
   Cond
   fun:strchr
   fun:dl_open_worker
}
{ 
   __rawmemchr/internal_getgrgid_r(Cond)
   Cond 
   fun:__rawmemchr
   fun:internal_getgrgid_r
} 
{ 
   _IO_vfprintf/__strnlen(Cond)
   Cond 
   fun:__strnlen
   fun:_IO_vfprintf
} 
{ 
   __strchrnul/gethostbyname*(Cond)
   Cond 
   fun:__strchrnul
   fun:gethostbyname*
} 


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

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

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

{
   *strchrnul*/*nss*(Cond)
   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)
   Addr4
   fun:__mpn_construct_double
   fun:*
}
{
   __mpn_construct_double/*(Addr8)
   Addr8
   fun:__mpn_construct_double
   fun:*
}

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


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


# More glibc stuff, AFAICS

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

#--------------
{
   _dl_relocate_object/dl_open_worker/_dl_catch_error(Cond)
   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)
   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)
   Cond
   fun:strrchr
   fun:_dl_map_object_from_fd
   fun:_dl_map_object
}

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

#----------------------
{
   write(buf)/__libc_write/libX11.so.6.2/libX11.so.6.2(Param)
   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)
   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)
#   Param
#   llseek(result)
#   fun:__libc_lseek64
#   fun:_IO_file_seek
#}

{
   writev(vector[...])/__writev/libX11.so.6.2/libX11.so.6.2
   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
   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
   Cond
   obj:*libc-2.2.4.so
   obj:/usr/X11R6/lib/libXt.so.6.0
   obj:/usr/X11R6/lib/libXt.so.6.0
}

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

