From 363533b51b0a35ccb586c957f4365a7258e1c30e Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Fri, 26 Jun 2009 07:00:00 +0000 Subject: [PATCH] Suppress a leak in setenv(). Fixes bug 188572. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10380 --- darwin9.supp | 12 +++++++++++ memcheck/tests/darwin/Makefile.am | 2 ++ memcheck/tests/darwin/env.c | 31 ++++++++++++++++++++++++++++ memcheck/tests/darwin/env.stderr.exp | 0 memcheck/tests/darwin/env.vgtest | 2 ++ 5 files changed, 47 insertions(+) create mode 100644 memcheck/tests/darwin/env.c create mode 100644 memcheck/tests/darwin/env.stderr.exp create mode 100644 memcheck/tests/darwin/env.vgtest diff --git a/darwin9.supp b/darwin9.supp index c397019b29..bbcfd66f61 100644 --- a/darwin9.supp +++ b/darwin9.supp @@ -143,6 +143,18 @@ fun:puts } +# Genuine leaks. +# See https://bugs.kde.org/show_bug.cgi?id=188572 about this; it's +# unavoidable due to BSD setenv() semantics. +{ + + Memcheck:Leak + fun:malloc_zone_malloc + fun:__setenv + fun:setenv$UNIX2003 + fun:main +} + ##----------------------------------------------------------------------## # diff --git a/memcheck/tests/darwin/Makefile.am b/memcheck/tests/darwin/Makefile.am index 8cc9f29ef9..1027300ec0 100644 --- a/memcheck/tests/darwin/Makefile.am +++ b/memcheck/tests/darwin/Makefile.am @@ -6,6 +6,7 @@ dist_noinst_SCRIPTS = filter_stderr noinst_HEADERS = scalar.h EXTRA_DIST = \ + env.stderr.exp env.vgtest \ pth-supp.stderr.exp pth-supp.vgtest \ scalar.stderr.exp scalar.vgtest \ scalar_fork.stderr.exp scalar_fork.vgtest \ @@ -13,6 +14,7 @@ EXTRA_DIST = \ scalar_vfork.stderr.exp scalar_vfork.vgtest check_PROGRAMS = \ + env \ pth-supp \ scalar \ scalar_fork \ diff --git a/memcheck/tests/darwin/env.c b/memcheck/tests/darwin/env.c new file mode 100644 index 0000000000..9e36b1574e --- /dev/null +++ b/memcheck/tests/darwin/env.c @@ -0,0 +1,31 @@ +#include +#include +#include + +// This tests that the suppression for the leak in setenv() works. See bug +// 188572. + +int main(void) +{ + char* val1 = "x"; + char* val2 = "xx"; + char* val3 = "xxx"; + + setenv("MYVAR", val1, /*overwrite*/0); // makes a copy which is later leaked + assert( 0 == strcmp(getenv("MYVAR"), val1) ); + + setenv("MYVAR", val2, /*overwrite*/1); // makes a copy which is later leaked + assert( 0 == strcmp(getenv("MYVAR"), val2) ); + + setenv("MYVAR", val3, /*overwrite*/0); // doesn't overwrite MYVAR=val2 + assert( 0 == strcmp(getenv("MYVAR"), val2) ); + + putenv("MYVAR=xxxx"); // no leak for putenv() + assert( 0 == strcmp(getenv("MYVAR"), "xxxx") ); + + unsetenv("MYVAR"); + assert( NULL == getenv("MYVAR") ); + + return 0; +} + diff --git a/memcheck/tests/darwin/env.stderr.exp b/memcheck/tests/darwin/env.stderr.exp new file mode 100644 index 0000000000..e69de29bb2 diff --git a/memcheck/tests/darwin/env.vgtest b/memcheck/tests/darwin/env.vgtest new file mode 100644 index 0000000000..75d46ff438 --- /dev/null +++ b/memcheck/tests/darwin/env.vgtest @@ -0,0 +1,2 @@ +prog: env +vgopts: -q --leak-check=full -- 2.47.3