Routing table name lookup failure
Andrew Kraslavsky
andykras at hotmail.com
Thu Sep 29 20:52:46 EDT 2011
Hello,
I am using:
libnl version 3.0
Linux kernel version 2.6.35.12
I have encountered a problem where, if I call rtnl_route_read_table_names, subsequent calls to rtnl_route_table2str return the ID as a hexadecimal string (e.g. "0xFE") instead of the name (e.g. "main") of the table. Sometimes, after calling rtnl_route_read_table_names my program will crash due to memory corruption. Please note that /etc/iproute2/rt_tables has not been modified.
Here's the call sequence:
if( rtnl_route_read_table_names( "/etc/iproute2/rt_tables" ) == 0 ){
char buf[32];
printf( "Name: %s\n", rtnl_route_table2str( 254, buf, sizeof( buf ) ) );
}
The print statement should show "mainline" but instead shows "0xFE".
I think I have tracked the problem down to __trans_list_clear, which is called by rtnl_route_read_table_names to flush any existing table_names list entries before repopulating it based on the contents of the specified file.
in __trans_list_clear, all entries are freed but the list head's previous and next pointers are not reset so the list continues to hold references to freed memory.
I created and applied the patch listed below to address this and it seems to do the trick. Please take a look at it and see if it will be of use.
==== //tps/libnl/3.0/mainline/src/lib/utils.c#3 .../src/lib/utils.c ====
@@ -854,16 +854,17 @@
void __trans_list_clear(struct nl_list_head *head)
{
struct trans_list *tl, *next;
nl_list_for_each_entry_safe(tl, next, head, list) {
free(tl->a);
free(tl);
}
+ nl_init_list_head(head);
}
Thank you,
- Andrew
More information about the libnl
mailing list