Commit aaa54c65 authored by Mu Qiao's avatar Mu Qiao Committed by Dan Williams
Browse files

ifnet: fix memory leak; handle file format changes

parent b46cf443
......@@ -21,11 +21,10 @@ libnm_settings_plugin_ifnet_la_CPPFLAGS = \
$(DBUS_CFLAGS) \
$(GUDEV_CFLAGS) \
-DG_DISABLE_DEPRECATED \
-DSYSCONFDIR=\"$(sysconfdir)\"\
-g
-DSYSCONFDIR=\"$(sysconfdir)\"
libnm_settings_plugin_ifnet_la_LDFLAGS = -module -avoid-version
libnm_settings_plugin_ifnet_la_LIBADD = \
$(top_builddir)/libnm-util/libnm-util.la \
$(top_builddir)/libnm-glib/libnm-glib.la \
......@@ -50,12 +49,9 @@ lib_ifnet_io_la_CPPFLAGS = \
$(DBUS_CFLAGS) \
-DG_DISABLE_DEPRECATED \
-DSYSCONFDIR=\"$(sysconfdir)\" \
-DSBINDIR=\"$(sbindir)\"\
-g
-DSBINDIR=\"$(sbindir)\"
lib_ifnet_io_la_LIBADD = \
$(top_builddir)/libnm-util/libnm-util.la \
$(GLIB_LIBS)\
$(GIO_LIBS)
......@@ -19,7 +19,6 @@
* Copyright (C) 1999-2010 Gentoo Foundation, Inc.
*/
#include <config.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
......@@ -194,6 +193,32 @@ ifnet_plugin_error_quark (void)
return error_quark;
}
static char *
find_default_gateway_str (char *str)
{
char *tmp;
if ((tmp = strstr (str, "default via ")) != NULL) {
return tmp + strlen ("default via ");
} else if ((tmp = strstr (str, "default gw ")) != NULL) {
return tmp + strlen ("default gw ");
}
return NULL;
}
static char *
find_gateway_str (char *str)
{
char *tmp;
if ((tmp = strstr (str, "via ")) != NULL) {
return tmp + strlen ("via ");
} else if ((tmp = strstr (str, "gw ")) != NULL) {
return tmp + strlen ("gw ");
}
return NULL;
}
gboolean
reload_parsers ()
{
......@@ -362,11 +387,10 @@ has_default_route (gchar * conn_name, gboolean (*check_fn) (gchar *))
if (!tmp)
return FALSE;
routes = g_strdup (tmp);
tmp = strstr (routes, "default via ");
tmp = find_default_gateway_str (routes);
if (!tmp) {
goto error;
}
tmp += strlen ("default via ");
g_strstrip (tmp);
if ((end = strstr (tmp, "\"")) != NULL)
*end = '\0';
......@@ -483,8 +507,13 @@ get_ip4_gateway (gchar * gateway)
if (!gateway)
return 0;
tmp = strstr (gateway, "via ");
tmp = g_strdup (tmp + strlen ("via "));
tmp = find_gateway_str (gateway);
if (!tmp) {
PLUGIN_WARN (IFNET_PLUGIN_NAME,
"Couldn't obtain gateway in \"%s\"", gateway);
return 0;
}
tmp = g_strdup (tmp);
strip_string (tmp, ' ');
strip_string (tmp, '"');
if ((split = strstr (tmp, "\"")) != NULL)
......@@ -509,8 +538,13 @@ get_ip6_next_hop (gchar * next_hop)
if (!next_hop)
return 0;
tmp = strstr (next_hop, "via ");
tmp = g_strdup (tmp + strlen ("via "));
tmp = find_gateway_str (next_hop);
if (!tmp) {
PLUGIN_WARN (IFNET_PLUGIN_NAME,
"Couldn't obtain next_hop in \"%s\"", next_hop);
return 0;
}
tmp = g_strdup (tmp);
strip_string (tmp, ' ');
strip_string (tmp, '"');
g_strstrip (tmp);
......@@ -671,8 +705,8 @@ convert_ip4_routes_block (gchar * conn_name)
length = g_strv_length (ipset);
for (i = 0; i < length; i++) {
ip = ipset[i];
if (strstr (ip, "default via ") || strstr (ip, "::")
|| !strstr (ip, "via"))
if (find_default_gateway_str (ip) || strstr (ip, "::")
|| !find_gateway_str (ip))
continue;
ip = strip_string (ip, '"');
iblock = create_ip4_block (ip);
......@@ -712,9 +746,7 @@ convert_ip6_routes_block (gchar * conn_name)
ip = strip_string (ip, '"');
if (ip[0] == '\0')
continue;
printf ("ip:%s\n", ip);
if ((tmp_addr = strstr (ip, "default via ")) != NULL) {
tmp_addr += strlen ("default via ");
if ((tmp_addr = find_default_gateway_str (ip)) != NULL) {
if (!is_ip6_address (tmp_addr))
continue;
else {
......@@ -855,7 +887,7 @@ is_managed (gchar * conn_name)
void
get_dhcp_hostname_and_client_id (char **hostname, char **client_id)
{
gchar *dhcp_client = ifnet_get_global_setting ("main", "dhcp");
gchar *dhcp_client = NULL;
const gchar *dhcpcd_conf = "/etc/dhcpcd.conf";
const gchar *dhclient_conf = "/etc/dhcp/dhclient.conf";
gchar *line = NULL, *tmp = NULL, *contents = NULL;
......@@ -864,6 +896,7 @@ get_dhcp_hostname_and_client_id (char **hostname, char **client_id)
*hostname = NULL;
*client_id = NULL;
dhcp_client = ifnet_get_global_setting ("main", "dhcp");
if (dhcp_client) {
if (!strcmp (dhcp_client, "dhclient"))
g_file_get_contents (dhclient_conf, &contents, NULL,
......@@ -871,6 +904,7 @@ get_dhcp_hostname_and_client_id (char **hostname, char **client_id)
else if (!strcmp (dhcp_client, "dhcpcd"))
g_file_get_contents (dhcpcd_conf, &contents, NULL,
NULL);
g_free (dhcp_client);
} else {
if (g_file_test (dhclient_conf, G_FILE_TEST_IS_REGULAR))
g_file_get_contents (dhclient_conf, &contents, NULL,
......
......@@ -40,7 +40,7 @@
#include "connection_parser.h"
#define IFNET_PLUGIN_NAME_PRINT "ifnet"
#define IFNET_PLUGIN_INFO "(C) 1999-2010 Gentoo Foundation, Inc. To report bugs please use bugs.gentoo.org with [networkmanager] or [dagger] prefix."
#define IFNET_PLUGIN_INFO "(C) 1999-2010 Gentoo Foundation, Inc. To report bugs please use bugs.gentoo.org with [networkmanager] or [qiaomuf] prefix."
#define IFNET_SYSTEM_HOSTNAME_FILE "/etc/conf.d/hostname"
#define IFNET_MANAGE_WELL_KNOWN_DEFAULT TRUE
#define IFNET_KEY_FILE_KEY_MANAGED "managed"
......
......@@ -6,8 +6,7 @@ INCLUDES=-I$(top_srcdir)/system-settings/plugins/ifnet\
TESTS = check_ifnet
check_PROGRAMS = check_ifnet
check_ifnet_SOURCES = test_all.c
check_ifnet_LDFLAGS = -g
check_ifnet_CPPFLAGS = $(CHECK_CFLAGS) $(GLIB_CFLAGS) -g
check_ifnet_CPPFLAGS = $(CHECK_CFLAGS) $(GLIB_CFLAGS)
check_ifnet_LDADD = $(top_srcdir)/libnm-util/libnm-util.la\
$(top_srcdir)/system-settings/plugins/ifnet/lib-ifnet-io.la\
$(CHECK_LIBS)\
......
......@@ -58,17 +58,22 @@ test_read_hostname ()
"get hostname",
"hostname is not correctly read, read:%s, expected: gentoo",
hostname);
g_free (hostname);
}
static void
test_write_hostname ()
{
gchar *hostname = read_hostname ("hostname");
gchar *tmp;
write_hostname ("gentoo-nm", "hostname");
ASSERT (strcmp (read_hostname ("hostname"), "gentoo-nm") == 0,
tmp = read_hostname ("hostname");
ASSERT (strcmp (tmp, "gentoo-nm") == 0,
"write hostname", "write hostname error");
write_hostname (hostname, "hostname");
g_free (tmp);
g_free (hostname);
}
static void
......@@ -85,14 +90,13 @@ test_is_static ()
static void
test_has_default_route ()
{
ASSERT (has_default_ip4_route ("eth0"), "has default route",
"eth0 should have a default ipv4 route");
ASSERT (has_default_ip6_route ("eth4"), "has default route",
"eth4 should have a default ipv6 route");
ASSERT (has_default_ip4_route ("eth0"),
"has default route", "eth0 should have a default ipv4 route");
ASSERT (has_default_ip6_route ("eth4"),
"has default route", "eth4 should have a default ipv6 route");
ASSERT (!has_default_ip4_route ("eth5")
&& !has_default_ip6_route ("eth5"), "has default route",
"eth5 shouldn't have a default route");
&& !has_default_ip6_route ("eth5"),
"has default route", "eth5 shouldn't have a default route");
}
static void
......@@ -138,8 +142,8 @@ check_ip_block (ip_block * iblock, gchar * ip, gchar * netmask, gchar * gateway)
str = malloc (INET_ADDRSTRLEN);
tmp_ip4_addr.s_addr = iblock->ip;
inet_ntop (AF_INET, &tmp_ip4_addr, str, INET_ADDRSTRLEN);
ASSERT (strcmp (ip, str) == 0, "check ip", "ip expected:%s, find:%s",
ip, str);
ASSERT (strcmp (ip, str) == 0, "check ip",
"ip expected:%s, find:%s", ip, str);
tmp_ip4_addr.s_addr = iblock->netmask;
inet_ntop (AF_INET, &tmp_ip4_addr, str, INET_ADDRSTRLEN);
ASSERT (strcmp (netmask, str) == 0, "check netmask",
......@@ -170,8 +174,8 @@ test_convert_ipv4_config_block ()
destroy_ip_block (iblock);
iblock = convert_ip4_config_block ("eth2");
ASSERT (iblock != NULL
&& iblock->next == NULL, "convert error IPv4 address",
"should only get one address");
&& iblock->next == NULL,
"convert error IPv4 address", "should only get one address");
check_ip_block (iblock, "192.168.4.121", "255.255.255.0", "0.0.0.0");
destroy_ip_block (iblock);
iblock = convert_ip4_config_block ("eth3");
......@@ -182,7 +186,6 @@ test_convert_ipv4_config_block ()
ASSERT (iblock != NULL, "convert config_block",
"convert error configuration");
destroy_ip_block (iblock);
}
static void
......@@ -209,10 +212,13 @@ test_wpa_parser ()
ASSERT (exist_ssid ("static-wep-test"), "exist_ssid",
"ssid static-wep-test is not found");
value = wpa_get_value ("static-wep-test", "key_mgmt");
ASSERT (value && strcmp (value, "NONE") == 0, "get wpa data",
ASSERT (value
&& strcmp (value, "NONE") == 0, "get wpa data",
"key_mgmt of static-wep-test should be NONE, find %s", value);
value = wpa_get_value ("static-wep-test", "wep_key0");
ASSERT (value && strcmp (value, "\"abcde\"") == 0, "get wpa data",
ASSERT (value
&& strcmp (value, "\"abcde\"") == 0,
"get wpa data",
"wep_key0 of static-wep-test should be abcde, find %s", value);
ASSERT (exist_ssid ("leap-example"), "get wsec",
"ssid leap-example is not found");
......@@ -228,8 +234,9 @@ test_strip_string ()
result = strip_string (result, '(');
result = strip_string (result, ')');
result = strip_string (result, '"');
ASSERT (strcmp (result, "default via 202.117.16.1") == 0,
"strip_string", "string isn't stripped, result is: %s", result);
ASSERT (strcmp (result, "default via 202.117.16.1") ==
0, "strip_string",
"string isn't stripped, result is: %s", result);
g_free (result_b);
}
......@@ -265,7 +272,6 @@ test_new_connection ()
"new connection failed: %s", error
&& (*error) ? (*error)->message : "NONE");
g_object_unref (connection);
}
static void
......@@ -280,8 +286,9 @@ test_update_connection ()
error == NULL ? "None" : (*error)->message);
ASSERT (ifnet_update_parsers_by_connection
(connection, "eth0", NULL, "net.generate",
"wpa_supplicant.conf.generate", error), "update connection",
"update connection failed %s", "eth0");
"wpa_supplicant.conf.generate", error),
"update connection", "update connection failed %s", "eth0");
g_object_unref (connection);
connection =
ifnet_update_connection_from_config_block ("0xab3ace", error);
ASSERT (connection != NULL, "get connection",
......@@ -289,8 +296,9 @@ test_update_connection ()
error == NULL ? "None" : (*error)->message);
ASSERT (ifnet_update_parsers_by_connection
(connection, "0xab3ace", NULL, "net.generate",
"wpa_supplicant.conf.generate", error), "update connection",
"update connection failed %s", "0xab3ace");
"wpa_supplicant.conf.generate", error),
"update connection", "update connection failed %s", "0xab3ace");
g_object_unref (connection);
}
static void
......@@ -301,14 +309,17 @@ test_add_connection ()
connection = ifnet_update_connection_from_config_block ("eth0", error);
ASSERT (ifnet_add_new_connection
(connection, "net.generate", "wpa_supplicant.conf.generate",
error), "add connection", "add connection failed: %s", "eth0");
(connection, "net.generate",
"wpa_supplicant.conf.generate", error),
"add connection", "add connection failed: %s", "eth0");
g_object_unref (connection);
connection =
ifnet_update_connection_from_config_block ("myxjtu2", error);
ASSERT (ifnet_add_new_connection
(connection, "net.generate", "wpa_supplicant.conf.generate",
error), "add connection", "add connection failed: %s",
"myxjtu2");
(connection, "net.generate",
"wpa_supplicant.conf.generate", error),
"add connection", "add connection failed: %s", "myxjtu2");
g_object_unref (connection);
}
static void
......@@ -322,16 +333,20 @@ test_delete_connection ()
"get connection failed: %s",
error == NULL ? "None" : (*error)->message);
ASSERT (ifnet_delete_connection_in_parsers
("eth7", "net.generate", "wpa_supplicant.conf.generate"),
("eth7", "net.generate",
"wpa_supplicant.conf.generate"),
"delete connection", "delete connection failed: %s", "eth7");
g_object_unref (connection);
connection =
ifnet_update_connection_from_config_block ("qiaomuf", error);
ASSERT (connection != NULL, "get connection",
"get connection failed: %s",
error == NULL ? "None" : (*error)->message);
ASSERT (ifnet_delete_connection_in_parsers
("qiaomuf", "net.generate", "wpa_supplicant.conf.generate"),
("qiaomuf", "net.generate",
"wpa_supplicant.conf.generate"),
"delete connection", "delete connection failed: %s", "qiaomuf");
g_object_unref (connection);
}
static void
......@@ -369,10 +384,8 @@ main (void)
wpa_parser_destroy ();
ifnet_init ("net");
wpa_parser_init ("wpa_supplicant.conf");
printf("Initialization complete\n");
printf ("Initialization complete\n");
run_all (TRUE);
ifnet_destroy ();
wpa_parser_destroy ();
return 0;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment