为什么正常调用 if_freenameindex 会加倍释放 if_nameindex ?

发布于 2024-08-10 06:54:46 字数 2214 浏览 3 评论 0原文

我正在Linux下学习套接字编程,所以我制作了一个示例程序来列出所有网络接口,这是运行它的代码

/* 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 to GNU C 库参考手册,我们应该使用 if_freenameindex 来释放早期返回的 if_nameindex。那么这是怎么回事呢?

谢谢。

I am learning socket programming under Linux,so I make a sample program to list all the network interface,here is the code

/* 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;
}

run it and it returns

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 to the GNU C Library Reference Manaul,we should use if_freenameindex to free the earily returned if_nameindex.So whats wrong?

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玩物 2024-08-17 06:54:46

您应该在第一个 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); 
....

You should call if_freenameindex() on first pif, not the final one. for example:

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); 
....
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文