diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-22 02:25:47 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-22 02:25:47 +0200 |
| commit | bbf17bbf326c7157ca237b9659472ddf7626e68d (patch) | |
| tree | 95450d50a1931a6b13f941cdf3deb036506148df | |
| parent | ef0366eb4f02bb0cda359b977fdbdfa7c145f76f (diff) | |
| download | busybox-w32-bbf17bbf326c7157ca237b9659472ddf7626e68d.tar.gz busybox-w32-bbf17bbf326c7157ca237b9659472ddf7626e68d.tar.bz2 busybox-w32-bbf17bbf326c7157ca237b9659472ddf7626e68d.zip | |
crond: do not assume setenv() does not leak
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | miscutils/crond.c | 6 | ||||
| -rw-r--r-- | scripts/test_setenv_leak.c | 18 |
2 files changed, 21 insertions, 3 deletions
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 @@ | |||
| 79 | #include "common_bufsiz.h" | 79 | #include "common_bufsiz.h" |
| 80 | #include <syslog.h> | 80 | #include <syslog.h> |
| 81 | 81 | ||
| 82 | /* glibc frees previous setenv'ed value when we do next setenv() | 82 | #if 0 |
| 83 | * of the same variable. uclibc does not do this! */ | 83 | /* If libc tracks and reuses setenv()-allocated memory, ok to set this to 0 */ |
| 84 | #if (defined(__GLIBC__) && !defined(__UCLIBC__)) /* || OTHER_SAFE_LIBC... */ | 84 | /* Neither glibc nor uclibc do that! */ |
| 85 | # define SETENV_LEAKS 0 | 85 | # define SETENV_LEAKS 0 |
| 86 | #else | 86 | #else |
| 87 | # define SETENV_LEAKS 1 | 87 | # 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 @@ | |||
| 1 | #include <stdio.h> | ||
| 2 | #include <stdlib.h> | ||
| 3 | #include <unistd.h> | ||
| 4 | int main(int argc, char **argv) | ||
| 5 | { | ||
| 6 | char buf[256]; | ||
| 7 | |||
| 8 | int i = argv[1] ? atoi(argv[1]) : 999999; | ||
| 9 | while (--i > 0) { | ||
| 10 | sprintf(buf, "%d", i); | ||
| 11 | setenv("VAR", buf, 1); | ||
| 12 | } | ||
| 13 | printf("Check size of [heap] mapping:\n"); | ||
| 14 | freopen("/proc/self/maps", "r", stdin); | ||
| 15 | while (fgets(buf, sizeof(buf), stdin)) | ||
| 16 | fputs(buf, stdout); | ||
| 17 | return 0; | ||
| 18 | } | ||
