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

# Errors to suppress by default for glibc 2.1.3

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

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

{
   socketcall.connect(serv_addr)/__libc_connect/*(Param)
   Param
   socketcall.connect(serv_addr)
   fun:__libc_connect
   fun:*
}

{
   strrchr/_dl_map_object_from_fd/_dl_map_object(Addr4)
   Addr4
   fun:strrchr
   fun:_dl_map_object_from_fd
   fun:_dl_map_object
}

{
   strrchr/_dl_map_object_from_fd/_dl_map_object(Value1)
   Value1
   fun:strrchr
   fun:_dl_map_object_from_fd
   fun:_dl_map_object
}

{
   llseek(result)/__libc_lseek64/_IO_file_seek(Param)
   Param
   llseek(result)
   fun:__libc_lseek64
   fun:_IO_file_seek
}

{
   __rawmemchr/_nl_*/*locale(Addr4)
   Addr4
   fun:__rawmemchr
   fun:_nl_*
   fun:*locale
}

# new ones for RH62 ls -l 
{
   __strchrnul/__nss_database_lookup(Cond)
   Cond
   fun:__strchrnul
   fun:__nss_database_lookup
}
{
   __strchrnul/__gethostbyname_r(Cond)
   Cond
   fun:__strchrnul
   fun:__gethostbyname_r
}

{
   strrchr/_dl_map*/_dl_map*(Cond)
   Cond
   fun:strrchr
   fun:_dl_map*
   fun:_dl_map*
}

{
   strchr/dl_open_worker/_dl_catch_error(Cond)
   Cond
   fun:strchr
   fun:dl_open_worker
   fun:_dl_catch_error
}

{
   __rawmemchr/???/__getgrgid_r(Cond)
   Cond
   fun:__rawmemchr
   fun:*
   fun:__getgrgid_r
}

{
   __rawmemchr/_nl_*/*locale*(Cond)
   Cond
   fun:__rawmemchr
   fun:_nl_*
   fun:*locale*
}

{
   _dl_relocate_object/dl_open_worker(Value0)
   Cond
   fun:_dl_relocate_object
   fun:dl_open_worker
}

##----------------------------------------------------------------------##
## from a Debian machine running kernel 2.2.19 I believe
## I guess most of these are the same as above really, but
## Debian stripped their libc-2.1.3

{
   libc-2.1.3.so/libc-2.1.3.so/libc-2.1.3.so(Cond)
   Cond
   obj:*libc-2.1.3.so
   obj:*libc-2.1.3.so
   obj:*libc-2.1.3.so
}

{
   strchr/libc-2.1.3.so(Cond)
   Cond
   fun:*strchr*
   obj:*libc-2.1.3.so
}

{
   libc-2.1.3.so/libXt.so(Cond)
   Cond
   obj:*libc-2.1.3.so
   obj:*libXt.so*
}

{
   socketcall.connect(serv_addr)/__libc_connect/*(Param)
   Param
   socketcall.connect(serv_addr)
   obj:*libc-2.1.3.so
   obj:*libX11.so*
}

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