Jac*_*ack 1 c memory-management buffer-overflow
我有一个C函数,像这样:
void foo(char ** out) {
*out = malloc(computedsize);
if(*out != NULL){
sprintf(*out, "%s,%s", foovar, baa);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我打电话给:
int main(void) {
char * out = NULL;
foo(&out);
printf("%s\n", out); /* so far, it works fine */
free(out); /* the problem. */
}
Run Code Online (Sandbox Code Playgroud)
我打电话的时候:
free(out);
它给出了:
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x09a03050 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0x4ff161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0x5009b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x503a9d]
./a.out[0x804875b]
./a.out[0x804871a]
./a.out[0x80486f9]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x4aabd6]
./a.out[0x8048601]
======= Memory map: ========
Run Code Online (Sandbox Code Playgroud)
//需要复制内存映射部分吗?
有人可以指出我的错误吗?我相信那是sprintf()......或者不,实际上,我不知道.我尝试过做内部功能的alloc值的新变量,然后*out = myvariable;和*out = strdup(myvariable),但free()呼叫给予同样的错误.
我看到问题出在函数内部.其中的任何free()调用都会导致下一个无效的大小.
例如:
char *f=malloc(2);
strcpy(f,"a");
free(f);
Run Code Online (Sandbox Code Playgroud)
内部foo()功能,得到上述错误,在main()功能上,正常工作.我完全失去了如何解决这个问题.