retitle 497835 gmanedit: CVE-2008-3971 buffer overflow when converting manpage 
to utf8
thanks

Hi,
the utf8 conversion issue got CVE-2008-3971 as an 
identifier, the COMMANDS issue is treated as a security 
issue as there is no need to overflow a buffer since the 
COMMANDS configuration variable can contain malicious 
commands anyway.

Attached is a debdiff to fix most of the minor (not security 
relevant) buffer overflows and the utf8 conversion thing.

It will be also archived on:
http://people.debian.org/~nion/nmu-diff/gmanedit-0.4.1-1_0.4.1-1.1.patch

Cheers
Nico

-- 
Nico Golde - http://www.ngolde.de - [EMAIL PROTECTED] - GPG: 0x73647CFF
For security reasons, all text in this mail is double-rot13 encrypted.
diff -u gmanedit-0.4.1/debian/changelog gmanedit-0.4.1/debian/changelog
--- gmanedit-0.4.1/debian/changelog
+++ gmanedit-0.4.1/debian/changelog
@@ -1,3 +1,13 @@
+gmanedit (0.4.1-1.1) unstable; urgency=high
+
+  * Non-maintainer upload by the Security Team.
+  * Fix heap-based buffer overflow on converting a manpage
+    from the currently used locale to utf8 and various other
+    not security relevant buffer overflows
+    (CVE-2008-3971; Closes: #497835).
+
+ -- Nico Golde <[EMAIL PROTECTED]>  Thu, 11 Sep 2008 13:05:52 +0200
+
 gmanedit (0.4.1-1) unstable; urgency=low
 
   [ Anibal Avelar ]
only in patch2:
unchanged:
--- gmanedit-0.4.1.orig/src/callbacks.c
+++ gmanedit-0.4.1/src/callbacks.c
@@ -646,14 +646,11 @@
 
 	if (datos==NULL)
 	{
-		strcpy(command,"xterm -e man -l ");
-		strcat(command,temp);
+		snprintf(command, sizeof command, "xterm -e man -l %s", temp);
 	}
 	else
 	{
-		strcpy(command,datos);
-		strcat(command," -l ");
-		strcat(command,temp);
+		snprintf(command, sizeof command, "%s -l %s", datos, temp);
 	}	
 
 	text=lookup_widget(wprincipal,"text");
@@ -707,7 +704,8 @@
 	aux=ReadConfFromFile("COMMAND");
 	if (aux != NULL)
 	{
-		strcpy(datos,aux);
+		strncpy(datos,aux, sizeof datos - 1);
+		datos[sizeof(datos) - 1] = 0;
 		obj=lookup_widget(GTK_WIDGET(prefs),"entry_command");
 		gtk_entry_set_text(GTK_ENTRY(obj),datos);
 	}
@@ -715,7 +713,8 @@
 	aux=ReadConfFromFile("INTERNET_BROWSER");
 	if (aux != NULL)
 	{
-		strcpy(datos,aux);
+		strncpy(datos,aux, sizeof(datos) - 1);
+		datos[sizeof(datos) - 1] = 0;
 		obj=lookup_widget(GTK_WIDGET(prefs),"combo2");
 		gtk_entry_set_text (GTK_ENTRY (GTK_BIN(obj)->child),datos);
 	}
@@ -825,20 +824,16 @@
 
 /* I get home directory */
 	home=(gchar *)getenv("HOME");
-	strcpy(cad2,home);
-	strcat(cad2,"/.gmaneditrc");
+	if(!home) return;
+	snprintf(cad2, sizeof cad2, "%s/.gmaneditrc", home);
 
 	entry=lookup_widget(prefs,"entry_command");
 	entry_text=gtk_entry_get_text(GTK_ENTRY(entry));
-	strcpy(cad,"# File created by gmanedit preferences option\n\nCOMMAND=");
-	strcat(cad,entry_text);
-	strcat(cad,"\n");
 	
 	ch = lookup_widget(prefs, "combo2");
 	browser = gtk_editable_get_chars
 		(GTK_EDITABLE (GTK_BIN(ch)->child), 0, -1);
-	strcat(cad,"INTERNET_BROWSER=");
-	strcat(cad,browser);
+	snprintf(cad, "# File created by gmanedit preferences option\n\nCOMMAND=%s\nINTERNET_BROWSER=%s", entry_text, browser);
 	g_free(browser);
 	
 	if ((p=fopen(cad2,"w"))!=NULL)
@@ -868,8 +863,8 @@
   
 // Intento de abrir el fichero con la configuraciĆ³n personalizada  
   home = getenv("HOME");
-  strcpy(readed,home);
-  strcat(readed,"/.gmaneditrc");
+  if(!home) return NULL;
+  snprintf(readed, sizeof readed, "%s/.gmaneditrc", home);
   
   f = fopen(readed,"r");
   if (f == NULL)
@@ -1109,8 +1104,7 @@
 	browser=ReadConfFromFile("INTERNET_BROWSER");
 	if (browser==NULL)
 		browser="mozilla";
-	strcpy(cad, browser);
-	strcat(cad, " http://sourceforge.net/projects/gmanedit2";);
+	snprintf(cad, sizeof cad, "%s http://sourceforge.net/projects/gmanedit2";, browser);
 
 	g_spawn_command_line_sync(cad, NULL, NULL, &exitstatus, NULL);
 }
@@ -1128,13 +1122,11 @@
 
 	if (datos==NULL)
 	{
-		strcpy(command,"xterm -e man");
-		strcat(command,temp);
+		snprintf(command, sizeof command, "xterm -e man %s", temp);
 	}
 	else
 	{
-		strcpy(command,datos);
-		strcat(command,temp);
+		snprintf(command, sizeof command, "%s%s", datos, temp);
 	}
 
 	g_spawn_command_line_sync(command, NULL, NULL, &exitstatus, NULL);
@@ -1188,8 +1180,10 @@
 			{
 				utf8 = g_locale_to_utf8(buffer, -1, NULL, NULL, NULL);
 			}
-			if (utf8 != NULL)
-				strncpy(buffer,utf8,strlen(utf8));
+			if (utf8 != NULL){
+				strncpy(buffer,utf8, BUFFER_SIZE - 1);
+				buffer[BUFFER_SIZE - 1] = 0;
+			}
 			gtk_text_buffer_insert_at_cursor(tb, buffer ,bytes_read);
 		} 
 	  }

Attachment: pgpdzOBoj92KO.pgp
Description: PGP signature

Reply via email to