SOURCES: libgnome-load-config.patch (NEW) - use dynamically alloca...

baggins baggins at pld-linux.org
Tue May 23 19:00:05 CEST 2006


Author: baggins                      Date: Tue May 23 17:00:05 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- use dynamically allocated buffers for config file reading,
  staticly sized buffer cause gnome to silently break on config files
  with lines longer than 4096 characters

---- Files affected:
SOURCES:
   libgnome-load-config.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/libgnome-load-config.patch
diff -u /dev/null SOURCES/libgnome-load-config.patch:1.1
--- /dev/null	Tue May 23 19:00:05 2006
+++ SOURCES/libgnome-load-config.patch	Tue May 23 19:00:00 2006
@@ -0,0 +1,124 @@
+diff -ur libgnome-2.14.1/libgnome/gnome-config.c libgnome-2.14.1.fix/libgnome/gnome-config.c
+--- libgnome-2.14.1/libgnome/gnome-config.c	2006-01-06 10:07:04.000000000 +0100
++++ libgnome-2.14.1.fix/libgnome/gnome-config.c	2006-05-23 18:56:30.000000000 +0200
+@@ -46,7 +46,6 @@
+ #endif
+ 
+ #define STRSIZE 4096
+-#define overflow (next == &CharBuffer [STRSIZE-1])
+ 
+ enum {
+ 	FirstBrace,
+@@ -311,13 +310,13 @@
+ 	FILE *f;
+ 	int state;
+ 	TSecHeader *SecHeader = NULL;
+-	char CharBuffer [STRSIZE];
+-	char *next = "";		/* Not needed */
++	GString *CharBuffer;
+ 	int c;
+ 	
+ 	if ((f = g_fopen (file, "r"))==NULL)
+ 		return NULL;
+-	
++
++	CharBuffer = g_string_new_len(NULL, STRSIZE);
+ 	state = FirstBrace;
+ 	while ((c = getc_unlocked (f)) != EOF){
+ 		if (c == '\r')		/* Ignore Carriage Return */
+@@ -326,13 +325,12 @@
+ 		switch (state){
+ 			
+ 		case OnSecHeader:
+-			if (c == ']' || overflow){
+-				*next = '\0';
+-				next = CharBuffer;
+-				SecHeader->section_name = g_strdup (CharBuffer);
++			if (c == ']'){
++				SecHeader->section_name = g_strdup (CharBuffer->str);
++				CharBuffer = g_string_truncate(CharBuffer, 0);
+ 				state = IgnoreToEOL;
+ 			} else
+-				*next++ = c;
++				CharBuffer = g_string_append_c(CharBuffer, c);
+ 			break;
+ 
+ 		case IgnoreToEOL:
+@@ -342,7 +340,7 @@
+ 					state = FirstBrace;
+ 				else
+ 					state = KeyDef;
+-				next = CharBuffer;
++				CharBuffer = g_string_truncate(CharBuffer, 0);
+ 			}
+ 			break;
+ 
+@@ -365,7 +363,7 @@
+ 				SecHeader->link = temp;
+ 				SecHeader->keys = NULL;
+ 				state = OnSecHeader;
+-				next = CharBuffer;
++				CharBuffer = g_string_truncate(CharBuffer, 0);
+ 				break;
+ 			}
+ 			/* On first pass, don't allow dangling keys */
+@@ -375,47 +373,45 @@
+ 			if ((c == ' ' && state != KeyDefOnKey) || c == '\t')
+ 				break;
+ 	    
+-			if (c == '\n' || overflow) { /* Abort Definition */
+-				next = CharBuffer;
++			if (c == '\n') { /* Abort Definition */
++				CharBuffer = g_string_truncate(CharBuffer, 0);
+ 				state = KeyDef;
+                                 break;
+                         }
+ 	    
+-			if (c == '=' || overflow){
++			if (c == '='){
+ 				TKeys *temp;
+ 
+ 				temp = SecHeader->keys;
+-				*next = '\0';
+ 				SecHeader->keys = (TKeys *) g_malloc (sizeof (TKeys));
+ 				SecHeader->keys->link = temp;
+-				SecHeader->keys->key_name = g_strdup (CharBuffer);
++				SecHeader->keys->key_name = g_strdup (CharBuffer->str);
+ 				state = KeyValue;
+-				next = CharBuffer;
++				CharBuffer = g_string_truncate(CharBuffer, 0);
+ 			} else {
+-				*next++ = c;
++				CharBuffer = g_string_append_c(CharBuffer, c);
+ 				state = KeyDefOnKey;
+ 			}
+ 			break;
+ 
+ 		case KeyValue:
+-			if (overflow || c == '\n'){
+-				*next = '\0';
+-				SecHeader->keys->value = decode_string_and_dup (CharBuffer);
++			if (c == '\n'){
++				SecHeader->keys->value = decode_string_and_dup (CharBuffer->str);
+ 				state = c == '\n' ? KeyDef : IgnoreToEOL;
+-				next = CharBuffer;
++				CharBuffer = g_string_truncate(CharBuffer, 0);
+ #ifdef GNOME_ENABLE_DEBUG
+ #endif
+ 			} else
+-				*next++ = c;
++				CharBuffer = g_string_append_c(CharBuffer, c);
+ 			break;
+ 	    
+ 		} /* switch */
+ 	
+ 	} /* while ((c = getc_unlocked (f)) != EOF) */
+ 	if (c == EOF && state == KeyValue){
+-		*next = '\0';
+-		SecHeader->keys->value = decode_string_and_dup (CharBuffer);
++		SecHeader->keys->value = decode_string_and_dup (CharBuffer->str);
+ 	}
++	g_string_free(CharBuffer, TRUE);
+ 	fclose (f);
+ 	return SecHeader;
+ }
================================================================


More information about the pld-cvs-commit mailing list