diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-22 03:04:20 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-22 03:04:20 +0200 |
commit | e4f6bfd6fec87e8eb77f1a9fe34b8b7884ef9748 (patch) | |
tree | 7d0279df538daa9f4df7be4044cae4a2ffdfe023 /networking/zcip.c | |
parent | bbf17bbf326c7157ca237b9659472ddf7626e68d (diff) | |
download | busybox-w32-e4f6bfd6fec87e8eb77f1a9fe34b8b7884ef9748.tar.gz busybox-w32-e4f6bfd6fec87e8eb77f1a9fe34b8b7884ef9748.tar.bz2 busybox-w32-e4f6bfd6fec87e8eb77f1a9fe34b8b7884ef9748.zip |
zcip: fix slow environment leak
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to '')
-rw-r--r-- | networking/zcip.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/networking/zcip.c b/networking/zcip.c index 232165efa..94174a165 100644 --- a/networking/zcip.c +++ b/networking/zcip.c | |||
@@ -183,6 +183,7 @@ static int run(char *argv[3], const char *param, uint32_t nip) | |||
183 | int status; | 183 | int status; |
184 | const char *addr = addr; /* for gcc */ | 184 | const char *addr = addr; /* for gcc */ |
185 | const char *fmt = "%s %s %s" + 3; | 185 | const char *fmt = "%s %s %s" + 3; |
186 | char *env_ip = env_ip; | ||
186 | 187 | ||
187 | argv[2] = (char*)param; | 188 | argv[2] = (char*)param; |
188 | 189 | ||
@@ -190,12 +191,16 @@ static int run(char *argv[3], const char *param, uint32_t nip) | |||
190 | 191 | ||
191 | if (nip != 0) { | 192 | if (nip != 0) { |
192 | addr = nip_to_a(nip); | 193 | addr = nip_to_a(nip); |
193 | xsetenv("ip", addr); | 194 | /* Must not use setenv() repeatedly, it leaks memory. Use putenv() */ |
195 | env_ip = xasprintf("ip=%s", addr); | ||
196 | putenv(env_ip); | ||
194 | fmt -= 3; | 197 | fmt -= 3; |
195 | } | 198 | } |
196 | bb_error_msg(fmt, argv[2], argv[0], addr); | 199 | bb_error_msg(fmt, argv[2], argv[0], addr); |
197 | |||
198 | status = spawn_and_wait(argv + 1); | 200 | status = spawn_and_wait(argv + 1); |
201 | if (nip != 0) | ||
202 | bb_unsetenv_and_free(env_ip); | ||
203 | |||
199 | if (status < 0) { | 204 | if (status < 0) { |
200 | bb_perror_msg("%s %s %s" + 3, argv[2], argv[0]); | 205 | bb_perror_msg("%s %s %s" + 3, argv[2], argv[0]); |
201 | return -errno; | 206 | return -errno; |