Package: gtkterm
Version: 0.99.5-1

When sending hexadecimal characters, gtkterm crashes.

There is an overflow in the Send_Hexadecimal function. The "written"
array holds only 3 chars, which is not enough to hold the 0 at the end.
Suggested patch attached.

Ubuntu 9.04
gtkterm 0.99.5-1ubuntu2

diff -rBNu gtkterm-0.99.5-orig/src/widgets.c gtkterm-0.99.5/src/widgets.c
--- gtkterm-0.99.5-orig/src/widgets.c	2005-09-22 21:13:00.000000000 +0100
+++ gtkterm-0.99.5/src/widgets.c	2009-07-21 09:53:13.000000000 +0100
@@ -54,7 +54,7 @@
 #endif
 #if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) \
      || defined (__NetBSD__) || defined (__NetBSD_kernel__) \
-     || defined (__OpenBSD__) || defined (__OpenBSD_kernel__) 
+     || defined (__OpenBSD__) || defined (__OpenBSD_kernel__)
 #  include <sys/ttycom.h>        /* For control signals */
 #endif
 #include <vte/vte.h>
@@ -156,7 +156,7 @@
 };
 
 static gchar *translate_menu(const gchar *path, gpointer data)
-{  
+{
   return _(path);
 }
 
@@ -174,7 +174,7 @@
 {
   show_index = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
   set_view(HEXADECIMAL_VIEW);
-  return FALSE;  
+  return FALSE;
 }
 
 gint hexadecimal_chars_to_display(gpointer *pointer, guint param, GtkWidget *widget)
@@ -216,7 +216,7 @@
 {
   if(!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
     return FALSE;
-  
+
   set_view(param);
 
   return FALSE;
@@ -267,10 +267,10 @@
   gtk_signal_connect(GTK_OBJECT(Fenetre), "destroy", (GtkSignalFunc)gtk_main_quit, NULL);
   gtk_signal_connect(GTK_OBJECT(Fenetre), "delete_event", (GtkSignalFunc)gtk_main_quit, NULL);
   gtk_window_set_title(GTK_WINDOW(Fenetre), "GtkTerm");
-  
+
   Boite = gtk_vbox_new(FALSE, 0);
   gtk_container_add(GTK_CONTAINER(Fenetre), Boite);
-  
+
   accel_group = gtk_accel_group_new();
   item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
   gtk_item_factory_set_translate_func(item_factory, translate_menu, "<main>", NULL);
@@ -290,7 +290,7 @@
   gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(hex_len_menu), TRUE);
 
   gtk_box_pack_start(GTK_BOX(Boite), Menu, FALSE, TRUE, 0);
-  
+
   BoiteH = gtk_hbox_new(FALSE, 0);
   gtk_box_pack_start(GTK_BOX(Boite), BoiteH, TRUE, TRUE, 0);
 
@@ -373,7 +373,7 @@
     return;
 
   while(i < size)
-    {    
+    {
       while(gtk_events_pending()) gtk_main_iteration();
       vte_terminal_get_cursor_position(VTE_TERMINAL(display), &column, &row);
 
@@ -395,12 +395,12 @@
 
       /* Print hexadecimal characters */
       data[0] = 0;
-      
+
       while(bytes < bytes_per_line && i < size)
 	{
 	  gint avance=0;
 	  gchar ascii[1];
- 
+
 	  sprintf(data_byte, "%02X ", (guchar)string[i]);
 	  vte_terminal_feed(VTE_TERMINAL(display), data_byte, 3);
 
@@ -410,17 +410,17 @@
 	  sprintf(data_byte, "%c[%dC", 27, avance);
 	  vte_terminal_feed(VTE_TERMINAL(display), data_byte, strlen(data_byte));
 
-	  /* Print ascii characters */	  
+	  /* Print ascii characters */
 	  ascii[0] = (string[i] > 0x1F) ? string[i] : '.';
 	  vte_terminal_feed(VTE_TERMINAL(display), ascii, 1);
 
-	  /* Move backward */	      
+	  /* Move backward */
 	  sprintf(data_byte, "%c[%dD", 27, avance + 1);
 	  vte_terminal_feed(VTE_TERMINAL(display), data_byte, strlen(data_byte));
 
 	  if(bytes == bytes_per_line / 2 - 1)
 	    vte_terminal_feed(VTE_TERMINAL(display), "- ", strlen("- "));
-	  
+
 	  bytes++;
 	  i++;
 
@@ -431,8 +431,8 @@
 	      total_bytes += bytes;
 	    }
 
-	}     
-      
+	}
+
     }
 }
 
@@ -441,7 +441,7 @@
   int pos;
   GString *buffer_tmp;
   gchar *in_buffer;
-  
+
   buffer_tmp =  g_string_new(string);
   in_buffer=buffer_tmp->str;
 
@@ -449,12 +449,12 @@
   for(pos=size; pos>0; pos--)
     {
       in_buffer--;
-      if(*in_buffer=='\r' && *(in_buffer+1) != '\n') 
+      if(*in_buffer=='\r' && *(in_buffer+1) != '\n')
 	{
 	  g_string_insert_c(buffer_tmp, pos, '\n');
 	  size += 1;
 	}
-      if(*in_buffer=='\n' && *(in_buffer-1) != '\r') 
+      if(*in_buffer=='\n' && *(in_buffer-1) != '\r')
 	{
 	  g_string_insert_c(buffer_tmp, pos-1, '\r');
 	  size += 1;
@@ -543,7 +543,7 @@
   if(stat & TIOCM_DTR)
     gtk_widget_set_sensitive(GTK_WIDGET(signals[5]), TRUE);
   else
-    gtk_widget_set_sensitive(GTK_WIDGET(signals[5]), FALSE);  
+    gtk_widget_set_sensitive(GTK_WIDGET(signals[5]), FALSE);
 }
 
 gint signaux(GtkWidget *widget, guint param)
@@ -578,15 +578,15 @@
 void show_message(gchar *message, gint type_msg)
 {
  GtkWidget *Fenetre_msg;
- 
+
  if(type_msg==MSG_ERR)
    {
-     Fenetre_msg = 
+     Fenetre_msg =
        gtk_message_dialog_new(GTK_WINDOW(Fenetre), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, message);
    }
  else if(type_msg==MSG_WRN)
    {
-     Fenetre_msg = 
+     Fenetre_msg =
        gtk_message_dialog_new(GTK_WINDOW(Fenetre), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, message);
    }
  else
@@ -604,7 +604,7 @@
   guchar val;
   guint val_read;
   guint sent = 0;
-  gchar written[3];
+  gchar written[4];
   gchar *all_written;
 
   text = (gchar *)gtk_entry_get_text(GTK_ENTRY(widget));
@@ -620,7 +620,7 @@
 	{
 	  val = (guchar)val_read;
 	  send_serial(&val, 1);
-	  sprintf(written, "%02X ", val);
+	  snprintf(written, sizeof(written), "%02X ", val);
 	  strcat(all_written, written);
 	  sent++;
 	}
@@ -646,7 +646,7 @@
 {
   /* time in ms */
   gtk_statusbar_push(GTK_STATUSBAR(StatusBar), id, text);
-  gtk_timeout_add(time, (GtkFunction)pop_message, NULL);  
+  gtk_timeout_add(time, (GtkFunction)pop_message, NULL);
 }
 
 gboolean pop_message(void)

Reply via email to