[Chilli] [PATCH] Fix: Memory leak of opt_run()
Masashi Honma
honma at ictec.co.jp
Mon Mar 8 04:53:50 UTC 2010
(2010/03/05 18:18), David Bird wrote:
> No, I haven't tried it in chilli, because it doesn't make much sense.
> The following will demonstrate my point.
I've tested your test code and gotten same result. But this code does
not describe what I want to say. I wrote some codes to describe my
thought. Try this patch and boot ChilliSpot with
# chilli -f -d
Index: main-opt.c
===================================================================
--- main-opt.c (revision 297)
+++ main-opt.c (working copy)
@@ -78,7 +78,17 @@
char hostname[USERURLSIZE];
int numargs;
int ret = -1;
+ char *p;
+ //printf("argc=%d\n", argc);
+ printf("argv[5]=%p\n", argv[5]);
+ printf("argv[6]=%s\n", argv[6]);
+ p = (char *)strtol(argv[6], NULL, 16);
+ printf("p=%p\n", p);
+ fflush(stdout);
+ free(p);
+ printf("p was freed\n");
+ fflush(stdout);
options_init();
memset(&args_info, 0, sizeof(args_info));
Index: options.c
===================================================================
--- options.c (revision 297)
+++ options.c (working copy)
@@ -117,6 +117,7 @@
static int opt_run(int argc, char **argv, int reload) {
char **newargs;
char file[128];
+ char messages[128];
int status;
int i;
@@ -133,10 +134,10 @@
return status;
}
- if (!(newargs = calloc(1, sizeof(char *) * (argc + 4)))) {
+ if (!(newargs = calloc(1, sizeof(char *) * (argc + 16)))) {
return -1;
}
-
+
for (i=1; i < argc; i++) {
newargs[i] = argv[i];
}
@@ -144,8 +145,15 @@
newargs[0] = "chilli_opt";
newargs[i++] = "-b";
newargs[i++] = file;
- newargs[i++] = reload ? "-r" : NULL;
+ //newargs[i++] = reload ? "-r" : NULL;
+ newargs[i++] = (char *)newargs;
+ printf("index=%d\n", i - 1);
+ printf("newargs[5]=%p\n", newargs[5]);
+ sprintf(messages, "%p", newargs[5]);
+ newargs[i++] = messages;
+ printf("newargs[6]=[%s]\n", newargs[6]);
+
log_dbg("running chilli_opt on %s", file);
if (execv(SBINDIR "/chilli_opt", newargs) != 0) {
I've gotten the result below on Linux
<stdout>
index=5
newargs[5]=0x9bf2028
newargs[6]=[0x9bf2028]
argv[5]=0xbf99beba
argv[6]=0x9bf2028
p=0x9bf2028
<dmesg>
[ 409.621596] chilli_opt[3284]: segfault at 9bf2024 ip b763e071 sp bf99afb8 error 4 in libc-2.10.2.so[b75ce000+141000]
This means newargs pointer address is different between "before execv"
and "after execv". And maybe the free() of p resulted in segfault.
(I don't know why the address of stdout is 0x9bf2028 and dmesg is 9bf2024.)
This result can't say the p was already freed. I think you believe that p is freed
implicitly. Can you prove the p is freed ?
More information about the Chilli
mailing list