@@ -100,49 +100,6 @@ static void callback_nl_link(struct nl_object *obj, void *arg)
100100 SET_STR_VALUE (ethi -> hwaddress , hwaddr );
101101}
102102
103- /**
104- * For use by callback_nl_address
105- * Returns 0 for success; -1 for error (though this is currently ignored)
106- */
107- static int
108- append_object_for_netlink_address (struct etherinfo * ethi ,
109- struct rtnl_addr * addr )
110- {
111- PyObject * addr_obj ;
112-
113- assert (ethi );
114- assert (ethi -> ipv4_addresses );
115- assert (ethi -> ipv6_addresses );
116- assert (addr );
117-
118- addr_obj = make_python_address_from_rtnl_addr (addr );
119- if (!addr_obj ) {
120- return -1 ;
121- }
122-
123- switch (rtnl_addr_get_family (addr )) {
124- case AF_INET :
125- if (-1 == PyList_Append (ethi -> ipv4_addresses , addr_obj )) {
126- Py_DECREF (addr_obj );
127- return -1 ;
128- }
129- break ;
130-
131- case AF_INET6 :
132- if (-1 == PyList_Append (ethi -> ipv6_addresses , addr_obj )) {
133- Py_DECREF (addr_obj );
134- return -1 ;
135- }
136- break ;
137-
138- default :
139- return -1 ;
140- }
141- Py_DECREF (addr_obj );
142-
143- /* Success */
144- return 0 ;
145- }
146103
147104/**
148105 * libnl callback function. Does the real parsing of a record returned by NETLINK. This function
@@ -155,19 +112,32 @@ static void callback_nl_address(struct nl_object *obj, void *arg)
155112{
156113 struct etherinfo * ethi = (struct etherinfo * ) arg ;
157114 struct rtnl_addr * rtaddr = (struct rtnl_addr * ) obj ;
115+ PyObject * addr_obj = NULL ;
116+ int af_family = -1 ;
158117
159118 if ( ethi == NULL ) {
160119 return ;
161120 }
121+ assert (ethi -> ipv4_addresses );
122+ assert (ethi -> ipv6_addresses );
162123
163- switch ( rtnl_addr_get_family (rtaddr ) ) {
164- case AF_INET :
165- case AF_INET6 :
166- append_object_for_netlink_address (ethi , rtaddr );
124+ /* Ensure that we're processing only known address types.
125+ * Currently only IPv4 and IPv6 is handled
126+ */
127+ af_family = rtnl_addr_get_family (rtaddr );
128+ if ( af_family != AF_INET && af_family != AF_INET6 ) {
129+ return ;
130+ }
131+
132+ /* Prepare a new Python object with the IP address */
133+ addr_obj = make_python_address_from_rtnl_addr (rtaddr );
134+ if (!addr_obj ) {
167135 return ;
168- default :
169- return ;
170136 }
137+ /* Append the IP address object to the proper address list */
138+ PyList_Append ((af_family == AF_INET6 ? ethi -> ipv6_addresses : ethi -> ipv4_addresses ),
139+ addr_obj );
140+ Py_DECREF (addr_obj );
171141}
172142
173143
0 commit comments