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

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

{
   libX11.so.6.2/libX11.so.6.2/libX11.so.6.2(Cond)
   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)
   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)
   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)
   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)
   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)
   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)
   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)
   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
}

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

