2009-11-09 47 views
1

我学习socket编程Linux下,所以我做的一个范例程序,列出所有的网络接口,这里是代码为什么正常调用if_freenameindex会使free if_nameindex倍增?

/* print the name of interface */ 
#include <sys/socket.h> 
#include <net/if.h> 
#include <stdio.h> 

int 
main(void) 
{ 
struct if_nameindex *pif; 

pif = if_nameindex(); 
while (pif->if_index) { 
    printf("name: %s \t index: %d\n", pif->if_name, pif->if_index); 
    pif++; 
} 

if_freenameindex(pif); 

printf("after the first if_freenameindex call\n"); 

return 0; 
} 

运行它,它会返回

 
name: lo index: 1 
name: eth0 index: 2 
name: eth1 index: 3 
name: eth2 index: 4 
*** glibc detected *** ./if: double free or corruption (out): 0x0983b420 *** 
======= Backtrace: ========= 
/lib/i686/cmov/libc.so.6[0xb7edb624] 
/lib/i686/cmov/libc.so.6(cfree+0x96)[0xb7edd826] 
/lib/i686/cmov/libc.so.6(if_freenameindex+0x40)[0xb7f6f9e0] 
./if[0x80484b6] 
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7e83455] 
./if[0x80483d1] 
======= Memory map: ======== 
08048000-08049000 r-xp 00000000 03:01 51169  /home/jcyang/src/net/gnu/if 
08049000-0804a000 rw-p 00000000 03:01 51169  /home/jcyang/src/net/gnu/if 
0983b000-0985c000 rw-p 0983b000 00:00 0   [heap] 
b7d00000-b7d21000 rw-p b7d00000 00:00 0 
b7d21000-b7e00000 ---p b7d21000 00:00 0 
b7e54000-b7e60000 r-xp 00000000 03:01 73587  /lib/libgcc_s.so.1 
b7e60000-b7e61000 rw-p 0000b000 03:01 73587  /lib/libgcc_s.so.1 
b7e6c000-b7e6d000 rw-p b7e6c000 00:00 0 
b7e6d000-b7fc2000 r-xp 00000000 03:01 82774  /lib/i686/cmov/libc-2.7.so 
b7fc2000-b7fc3000 r--p 00155000 03:01 82774  /lib/i686/cmov/libc-2.7.so 
b7fc3000-b7fc5000 rw-p 00156000 03:01 82774  /lib/i686/cmov/libc-2.7.so 
b7fc5000-b7fc9000 rw-p b7fc5000 00:00 0 
b7fd3000-b7fd5000 rw-p b7fd3000 00:00 0 
b7fd5000-b7fd6000 r-xp b7fd5000 00:00 0   [vdso] 
b7fd6000-b7ff0000 r-xp 00000000 03:01 73586  /lib/ld-2.7.so 
b7ff0000-b7ff2000 rw-p 0001a000 03:01 73586  /lib/ld-2.7.so 
bffdc000-bfff1000 rw-p bffeb000 00:00 0   [stack] 
Aborted 

Acoording到GNU C Library Reference Manaul ,我们应该使用如果_ freenameindex免费返回,如果_ nameindex.So最新怎么了?

谢谢。

+0

+1我犯了这个完全相同的错误。 – 2011-03-11 19:55:25

回答

3

你应该在第一个pif上调用if_freenameindex(),而不是最后一个。例如:

struct if_nameindex *pif; 
struct if_nameindex *head; 
head = pif = if_nameindex(); 
while (pif->if_index) { 
    printf("name: %s \t index: %d\n", pif->if_name, pif->if_index); 
    pif++; 
} 

if_freenameindex(head); 
....