From bbf17bbf326c7157ca237b9659472ddf7626e68d Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sat, 22 Jul 2017 02:25:47 +0200 Subject: crond: do not assume setenv() does not leak Signed-off-by: Denys Vlasenko --- miscutils/crond.c | 6 +++--- scripts/test_setenv_leak.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 scripts/test_setenv_leak.c diff --git a/miscutils/crond.c b/miscutils/crond.c index cf3323090..5ae0ff084 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c @@ -79,9 +79,9 @@ #include "common_bufsiz.h" #include -/* glibc frees previous setenv'ed value when we do next setenv() - * of the same variable. uclibc does not do this! */ -#if (defined(__GLIBC__) && !defined(__UCLIBC__)) /* || OTHER_SAFE_LIBC... */ +#if 0 +/* If libc tracks and reuses setenv()-allocated memory, ok to set this to 0 */ +/* Neither glibc nor uclibc do that! */ # define SETENV_LEAKS 0 #else # define SETENV_LEAKS 1 diff --git a/scripts/test_setenv_leak.c b/scripts/test_setenv_leak.c new file mode 100644 index 000000000..e51722ca7 --- /dev/null +++ b/scripts/test_setenv_leak.c @@ -0,0 +1,18 @@ +#include +#include +#include +int main(int argc, char **argv) +{ + char buf[256]; + + int i = argv[1] ? atoi(argv[1]) : 999999; + while (--i > 0) { + sprintf(buf, "%d", i); + setenv("VAR", buf, 1); + } + printf("Check size of [heap] mapping:\n"); + freopen("/proc/self/maps", "r", stdin); + while (fgets(buf, sizeof(buf), stdin)) + fputs(buf, stdout); + return 0; +} -- cgit v1.2.3