about summary refs log tree commit diff
path: root/debian/patches/10-interface_parser_fixes.patch
diff options
context:
space:
mode:
authorMichael Biebl <biebl@teco.edu>2006-05-10 00:36:14 +0000
committerMichael Biebl <biebl@teco.edu>2006-05-10 00:36:14 +0000
commita5a5d5671a0c793b4d45373947178fa77fec9a16 (patch)
treeeb7a5f844a1aabd50512208dda833bc776086b0d /debian/patches/10-interface_parser_fixes.patch
parent63b3f3f48fb827a50b82d46c358dbedea4060770 (diff)
Fix the /etc/network/interfaces parser:
- Only add data to an existing block (prevents segfault)
- Support mapping and allow-* stanzas.


git-svn-id: svn+ssh://svn.debian.org/svn/pkg-utopia/packages/unstable/networkmanager@820 ceb527fc-18e6-0310-9fe2-813c157c29e7
Diffstat (limited to 'debian/patches/10-interface_parser_fixes.patch')
-rw-r--r--debian/patches/10-interface_parser_fixes.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/debian/patches/10-interface_parser_fixes.patch b/debian/patches/10-interface_parser_fixes.patch
new file mode 100644
index 00000000..e751e359
--- /dev/null
+++ b/debian/patches/10-interface_parser_fixes.patch
@@ -0,0 +1,90 @@
+Index: src/backends/interface_parser.c
+===================================================================
+RCS file: /cvs/gnome/NetworkManager/src/backends/interface_parser.c,v
+retrieving revision 1.6
+diff -u -3 -p -r1.6 interface_parser.c
+--- src/backends/interface_parser.c	24 Oct 2005 15:04:28 -0000	1.6
++++ src/backends/interface_parser.c	9 May 2006 23:06:35 -0000
+@@ -50,6 +50,10 @@ void add_block(const char *type, const c
+ 
+ void add_data(const char *key,const char *data)
+ {
++	// Check if there is a block where we can attach our data
++	if (first == NULL)
++		return;
++			
+ 	if_data *ret = (if_data*)calloc(1,sizeof(struct _if_data));
+ 	ret->key = g_strdup(key);
+ 	ret->data = g_strdup(data);
+@@ -73,6 +77,10 @@ void ifparser_init(void)
+ {
+ 	FILE *inp = fopen(INTERFACES,"r");
+ 	int ret = 0;
++	char *line;
++	char *space;
++	char rline[255];
++
+ 	if (inp == NULL)
+ 	{
+ 		nm_warning ("Error: Can't open %s\n",INTERFACES);
+@@ -81,10 +89,16 @@ void ifparser_init(void)
+ 	first = last = NULL;
+ 	while(1)
+ 	{
+-		char *line,rline[255],*space;
++		line = space = NULL;
+ 		ret = fscanf(inp,"%255[^\n]\n",rline);
+ 		if (ret == EOF)
+ 			break;
++		// If the line did not match, skip it
++		if (ret == 0) {
++			fgets(rline, 255, inp);
++			continue;
++		}
++		
+ 		line = rline;
+ 		while(line[0] == ' ')
+ 			line++;
+@@ -94,18 +108,19 @@ void ifparser_init(void)
+ 		SPACE_OR_TAB(line,space)
+ 		if (space == NULL)
+ 		{
+-            nm_warning ("Error: Can't parse interface line '%s'\n",line);
++			nm_warning ("Error: Can't parse interface line '%s'\n",line);
+ 			continue;
+ 		}
+ 		space[0] = '\0';
+ 		
+-		
++		// There are four different stanzas:
++		// iface, mapping, auto and allow-*. Create a block for each of them.
+ 		if (strcmp(line,"iface")==0)
+ 		{
+ 			char *space2 = strchr(space+1,' ');
+ 			if (space2 == NULL)
+ 			{
+-            	nm_warning ("Error: Can't parse iface line '%s'\n",space+1);
++				nm_warning ("Error: Can't parse iface line '%s'\n",space+1);
+ 				continue;
+ 			}
+ 			space2[0]='\0';
+@@ -116,7 +131,7 @@ void ifparser_init(void)
+ 				space = strchr(space2+1,' ');
+ 				if (space == NULL)
+ 				{
+-            		nm_warning ("Error: Can't parse data '%s'\n",space2+1);
++					nm_warning ("Error: Can't parse data '%s'\n",space2+1);
+ 					continue;
+ 				}
+ 				space[0] = '\0';
+@@ -124,6 +139,10 @@ void ifparser_init(void)
+ 			}
+ 		}
+ 		else if (strcmp(line,"auto")==0)
++			add_block(line,space+1);
++		else if (strcmp(line,"mapping")==0)
++			add_block(line,space+1);
++		else if (strncmp(line,"allow-",6)==0)
+ 			add_block(line,space+1);
+ 		else
+ 			add_data(line,space+1);