>From 1894f61dc46c9c266d7caf4caada12046f7f91e5 Mon Sep 17 00:00:00 2001 From: Ashish Shukla Date: Sat, 11 Oct 2008 17:55:46 +0530 Subject: [PATCH] 2008-10-11 Ashish Shukla * libroute/route_bsd.c (bsd_rt_msg_send): Removed un-necessary sockaddr structure additions to the rt_msg structure. (bsd_add): Cleaned up the netmask code, and fixed a memory leak. (bsd_delete): Implemented. --- ChangeLog | 7 ++ libroute/route_bsd.c | 151 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 125 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index bdd00db..09c67ad 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-10-11 Ashish Shukla + + * libroute/route_bsd.c (bsd_rt_msg_send): Removed un-necessary + sockaddr structure additions to the rt_msg structure. + (bsd_add): Cleaned up the netmask code, and fixed a memory leak. + (bsd_delete): Implemented. + 2008-10-07 Ashish Shukla * libroute/route_bsd.h: Removed flags parameter from 'bsd_add' diff --git a/libroute/route_bsd.c b/libroute/route_bsd.c index c660d81..9d46db4 100644 --- a/libroute/route_bsd.c +++ b/libroute/route_bsd.c @@ -118,21 +118,24 @@ bsd_add (const int address_family, if(address_family == AF_INET) { - char* p; - int len = dest_addr_len; - msg.addr[RTAX_NETMASK] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in)); - ((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_family = AF_INET; - ((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_len = sizeof(struct sockaddr_in); - p = (char*)&((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_addr; - - for(i = 1; i <= len; i++) + if(dest_addr_len) { - *p >>= 1; - *p |= 0x80; - - if(!(i & 7)) - p++; + char* p; + + msg.addr[RTAX_NETMASK] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in)); + ((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_family = AF_INET; + ((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_len = sizeof(struct sockaddr_in); + p = (char*)&((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_addr; + + for(i = 1; i <= dest_addr_len; i++) + { + *p >>= 1; + *p |= 0x80; + + if(!(i & 7)) + p++; + } } if(dest_addr) @@ -154,21 +157,23 @@ bsd_add (const int address_family, } else if(address_family == AF_INET6) { - char* p; - int len = dest_addr_len; - - msg.addr[RTAX_NETMASK] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in6)); - ((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_family = AF_INET6; - ((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_len = sizeof(struct sockaddr_in6); - p = (char*)&((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_addr; - - for(i = 1; i <= len; i++) + if(dest_addr_len) { - *p >>= 1; - *p |= 0x80; + char* p; + + msg.addr[RTAX_NETMASK] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in6)); + ((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_family = AF_INET6; + ((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_len = sizeof(struct sockaddr_in6); + p = (char*)&((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_addr; + + for(i = 1; i <= dest_addr_len; i++) + { + *p >>= 1; + *p |= 0x80; - if(!(i & 7)) - p++; + if(!(i & 7)) + p++; + } } if(dest_addr) @@ -196,6 +201,9 @@ bsd_add (const int address_family, { if(((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index == iface) { + if(msg.addr[RTAX_GATEWAY]) + free(msg.addr[RTAX_GATEWAY]); + msg.addr[RTAX_GATEWAY] = xmalloc(SA_SIZE(ifa->ifa_addr)); memcpy(msg.addr[RTAX_GATEWAY], ifa->ifa_addr, SA_SIZE(ifa->ifa_addr)); break; @@ -249,11 +257,10 @@ bsd_rt_msg_send(int msg_type, int msg_iface, int msg_seq, { memcpy(addr, message->addr[i], SA_SIZE(message->addr[i])); rtm->rtm_addrs |= (1 << i); + + len += SA_SIZE(addr); + addr = (struct sockaddr*)(((char*)addr) + SA_SIZE(addr)); } - else - memcpy(addr, &sa_empty, SA_SIZE(&sa_empty)); - len += SA_SIZE(addr); - addr = (struct sockaddr*)(((char*)addr) + SA_SIZE(addr)); } rtm->rtm_msglen = len; @@ -507,10 +514,88 @@ bsd_rt_msg_next (const struct rt_msghdr *rtm, size_t *const length) } void -bsd_delete (const int format, +bsd_delete (const int address_family, const void *const dest_addr, const size_t dest_addr_size, - const unsigned char dest_len) + const unsigned char dest_addr_len) { - /* TODO */ + pf_route_message_t msg; + int i; + + memset(&msg, 0, sizeof(pf_route_message_t)); + + if(address_family == AF_INET) + { + + if(dest_addr_len) + { + + char* p; + + msg.addr[RTAX_NETMASK] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in)); + ((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_family = AF_INET; + ((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_len = sizeof(struct sockaddr_in); + p = (char*)&((struct sockaddr_in*)msg.addr[RTAX_NETMASK])->sin_addr; + + for(i = 1; i <= dest_addr_len; i++) + { + *p >>= 1; + *p |= 0x80; + + if(!(i & 7)) + p++; + } + } + + if(dest_addr) + { + msg.addr[RTAX_DST] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in)); + ((struct sockaddr_in*)msg.addr[RTAX_DST])->sin_family = AF_INET; + ((struct sockaddr_in*)msg.addr[RTAX_DST])->sin_len = sizeof(struct sockaddr_in); + memcpy(&((struct sockaddr_in*)msg.addr[RTAX_DST])->sin_addr, dest_addr, dest_addr_size); + } + } + else if(address_family == AF_INET6) + { + + if(dest_addr_len) + { + + char* p; + + msg.addr[RTAX_NETMASK] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in6)); + ((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_family = AF_INET6; + ((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_len = sizeof(struct sockaddr_in6); + p = (char*)&((struct sockaddr_in6*)msg.addr[RTAX_NETMASK])->sin6_addr; + + for(i = 1; i <= dest_addr_len; i++) + { + *p >>= 1; + *p |= 0x80; + + if(!(i & 7)) + p++; + } + } + + if(dest_addr) + { + msg.addr[RTAX_DST] = (struct sockaddr*)xcalloc(1, sizeof(struct sockaddr_in6)); + ((struct sockaddr_in6*)msg.addr[RTAX_DST])->sin6_family = AF_INET6; + ((struct sockaddr_in6*)msg.addr[RTAX_DST])->sin6_len = sizeof(struct sockaddr_in6); + memcpy(&((struct sockaddr_in6*)msg.addr[RTAX_DST])->sin6_addr, dest_addr, dest_addr_size); + } + } + + + bsd_rt_msg_send(RTM_DELETE, 0, 0, RTF_UP | RTF_STATIC, &msg); + + for(i = 0; i < RTAX_MAX; i++) + if(msg.addr[i]) + { + free(msg.addr[i]); + msg.addr[i] = NULL; + } + + return; } -- 1.6.0.2