Index: addressbook/importers/evolution-csv-importer.c
===================================================================
--- addressbook/importers/evolution-csv-importer.c	(revision 35677)
+++ addressbook/importers/evolution-csv-importer.c	(working copy)
@@ -266,12 +266,19 @@ add_to_notes(EContact *contact, gint i, 
 	GString *new_text;
 
 	old_text = e_contact_get_const(contact, E_CONTACT_NOTE);
-	if(importer == OUTLOOK_IMPORTER)
-		field_text = csv_fields_outlook[i].csv_attribute;
-	else if(importer == MOZILLA_IMPORTER)
-		field_text = csv_fields_mozilla[i].csv_attribute;
-	else
-		field_text = csv_fields_evolution[i].csv_attribute;
+	if (importer == OUTLOOK_IMPORTER) {
+		if (i >= 0 && i < G_N_ELEMENTS (csv_fields_outlook))
+			field_text = csv_fields_outlook[i].csv_attribute;
+	} else if (importer == MOZILLA_IMPORTER) {
+		if (i >= 0 && i < G_N_ELEMENTS (csv_fields_mozilla))
+			field_text = csv_fields_mozilla[i].csv_attribute;
+	} else {
+		if (i >= 0 && i < G_N_ELEMENTS (csv_fields_evolution))
+			field_text = csv_fields_evolution[i].csv_attribute;
+	}
+
+	if (!field_text)
+		return;
 
 	new_text = g_string_new(old_text);
 	if(strlen(new_text->str) != 0)
@@ -325,9 +332,9 @@ date_from_string (const char *str)
 }
 
 static gboolean
-parseLine (CSVImporter *gci, EContact *contact, char **buf) {
+parseLine (CSVImporter *gci, EContact *contact, char *buf) {
 
-	char *ptr = *buf;
+	char *ptr = buf, *do_free = NULL;
 	GString *value;
 	gint i = 0;
 	int flags = 0;
@@ -343,8 +350,10 @@ parseLine (CSVImporter *gci, EContact *c
 	other_address = g_new0(EContactAddress, 1);
 	bday = g_new0(EContactDate, 1);
 
-	if (!g_utf8_validate (ptr, -1, NULL))
-		ptr = g_convert (ptr, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
+	if (!g_utf8_validate (ptr, -1, NULL)) {
+		do_free = g_convert (ptr, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
+		ptr = do_free;
+	}
 
 	while(*ptr != '\n') {
 		value = g_string_new("");
@@ -366,27 +375,45 @@ parseLine (CSVImporter *gci, EContact *c
 			}
 			ptr = g_utf8_next_char (ptr);
 		}
+
+		contact_field = NOMAP;
+		flags = FLAG_INVALID;
+
 		if(importer == OUTLOOK_IMPORTER) {
-			contact_field = csv_fields_outlook[i].contact_field;
-			flags = csv_fields_outlook[i].flags;
+			if (i >= 0 && i < G_N_ELEMENTS (csv_fields_outlook)) {
+				contact_field = csv_fields_outlook[i].contact_field;
+				flags = csv_fields_outlook[i].flags;
+			}
 		}
 		else if(importer == MOZILLA_IMPORTER) {
-			contact_field = csv_fields_mozilla[i].contact_field;
-			flags = csv_fields_mozilla[i].flags;
+			if (i >= 0 && i < G_N_ELEMENTS (csv_fields_mozilla)) {
+				contact_field = csv_fields_mozilla[i].contact_field;
+				flags = csv_fields_mozilla[i].flags;
+			}
 		}
 		else {
-			contact_field = csv_fields_evolution[i].contact_field;
-			flags = csv_fields_evolution[i].flags;
+			if (i >= 0 && i < G_N_ELEMENTS (csv_fields_evolution)) {
+				contact_field = csv_fields_evolution[i].contact_field;
+				flags = csv_fields_evolution[i].flags;
+			}
 		}
 
 		if(strlen(value->str) != 0) {
 			if (contact_field != NOMAP) {
-				if(importer == OUTLOOK_IMPORTER)
-					e_contact_set(contact, csv_fields_outlook[i].contact_field, value->str);
-				else if(importer == MOZILLA_IMPORTER)
-					e_contact_set(contact, csv_fields_mozilla[i].contact_field, value->str);
-				else
-					e_contact_set(contact, csv_fields_evolution[i].contact_field, value->str);
+				if(importer == OUTLOOK_IMPORTER) {
+					if (i >= 0 && i < G_N_ELEMENTS (csv_fields_outlook))
+						e_contact_set (contact, csv_fields_outlook[i].contact_field, value->str);
+				} else if(importer == MOZILLA_IMPORTER) {
+					if (i >= 0 && i < G_N_ELEMENTS (csv_fields_mozilla))
+						e_contact_set (contact, csv_fields_mozilla[i].contact_field, value->str);
+				} else {
+					if (i >= 0 && i < G_N_ELEMENTS (csv_fields_evolution)) {
+						if (csv_fields_evolution[i].contact_field == E_CONTACT_WANTS_HTML)
+							e_contact_set (contact, csv_fields_evolution[i].contact_field, GINT_TO_POINTER (g_ascii_strcasecmp (value->str, "TRUE") == 0));
+						else
+							e_contact_set (contact, csv_fields_evolution[i].contact_field, value->str);
+					}
+				}
 			}
 			else {
 				switch (flags) {
@@ -514,6 +541,8 @@ parseLine (CSVImporter *gci, EContact *c
 			e_contact_set(contact, E_CONTACT_BIRTH_DATE, bday);
 	}
 
+	g_free (do_free);
+
 	return TRUE;
 }
 
@@ -598,7 +627,7 @@ getNextCSVEntry(CSVImporter *gci, FILE *
 
 	buf = str->str;
 
-	if(!parseLine (gci, contact, &buf)) {
+	if(!parseLine (gci, contact, buf)) {
 		g_object_unref(contact);
 		return NULL;
 	}
Index: addressbook/ChangeLog
===================================================================
--- addressbook/ChangeLog	(revision 35677)
+++ addressbook/ChangeLog	(working copy)
@@ -1,3 +1,13 @@
+2008-06-23  Milan Crha  <mcrha@redhat.com>
+
+	** Fix for bug #539755
+
+	* importers/evolution-csv-importer.c: (parseLine):
+	Do not leak (introduced in bug #440818).
+	* importers/evolution-csv-importer.c: (add_to_notes),
+	(parseLine), (getNextCSVEntry): Do not access memory beyond
+	the columns array.
+
 2008-06-23  Milan Crha  <mcrha@redhat.com>
 
 	** Fix for bug #440818 (patch by Rodrigo Castro)
