Author: ken
Date: 2009-08-26 12:53:39 -0600 (Wed, 26 Aug 2009)
New Revision: 2104

Added:
   trunk/gnumeric/gnumeric-1.8.4-fixes-1.patch
Log:
Make gnumeric work reliably with gtk+-2.16, and also pick up the fix for the 
Python vulnerability within gnumeric.

Added: trunk/gnumeric/gnumeric-1.8.4-fixes-1.patch
===================================================================
--- trunk/gnumeric/gnumeric-1.8.4-fixes-1.patch                         (rev 0)
+++ trunk/gnumeric/gnumeric-1.8.4-fixes-1.patch 2009-08-26 18:53:39 UTC (rev 
2104)
@@ -0,0 +1,230 @@
+Submitted By: Ken Moffat <ken at linuxfromscratch dot org>
+Date: 2009-08-26
+Initial Package Version: 1.8.4 (probably also applies to earlier 1.8)
+Upstream Status: Applied
+Origin: Upstream, via ubuntu.
+Description: First part works around the Python vulnerability [ CVE-2009-0318 
],
+second part works around gtk+-2.16 changes.  Gnome bugs 569648 and 575267.
+
+--- gnumeric-1.8.4.orig/plugins/python-loader/ChangeLog
++++ gnumeric-1.8.4/plugins/python-loader/ChangeLog
+@@ -1,3 +1,9 @@
++2009-01-29  Jon K Hellan  <[email protected]>
++
++      * gnm-py-interpreter.c (gnm_py_interpreter_new): Work around
++      security vulnerability in Python by making argv start with
++      "/dev/null". #569648.
++
+ 2009-01-18  Jody Goldberg <[email protected]>
+ 
+       * Release 1.8.4
+--- gnumeric-1.8.4.orig/plugins/python-loader/gnm-py-interpreter.c
++++ gnumeric-1.8.4/plugins/python-loader/gnm-py-interpreter.c
+@@ -79,7 +79,7 @@
+               G_TYPE_NONE, 0);
+ }
+ 
+-static char *plugin_argv[] = {(char *) "gnumeric", NULL};
++static char *plugin_argv[] = {(char *) "/dev/null/python/is/buggy/gnumeric", 
NULL};
+ 
+ GnmPyInterpreter *
+ gnm_py_interpreter_new (GOPlugin *plugin)
+--- gnumeric-1.8.4.orig/src/application.h
++++ gnumeric-1.8.4/src/application.h
+@@ -79,6 +79,7 @@
+       GnmActionHandler        handler;
+ };
+ typedef struct {
++      char const *group_name;
+       GSList     *actions;
+       char       *layout;
+       char const *domain;
+@@ -90,7 +91,8 @@
+                           GnmActionHandler handler);
+ void     gnm_action_free (GnmAction *action);
+ 
+-GnmAppExtraUI *gnm_app_add_extra_ui (GSList *actions, char *layout,
++GnmAppExtraUI *gnm_app_add_extra_ui (char const *group_name,
++                                   GSList *actions, char *layout,
+                                    char const *domain,
+                                    gpointer user_data);
+ void     gnm_app_remove_extra_ui  (GnmAppExtraUI *extra_ui);
+--- gnumeric-1.8.4.orig/src/wbc-gtk.c
++++ gnumeric-1.8.4/src/wbc-gtk.c
+@@ -3010,7 +3010,7 @@
+       GtkAction       *res;
+ 
+       details = g_new0 (CustomUIHandle, 1);
+-      details->actions = gtk_action_group_new ("DummyName");
++      details->actions = gtk_action_group_new (extra_ui->group_name);
+ 
+       for (ptr = extra_ui->actions; ptr != NULL ; ptr = ptr->next) {
+               action = ptr->data;
+--- gnumeric-1.8.4.orig/src/gnm-pane.c
++++ gnumeric-1.8.4/src/gnm-pane.c
+@@ -587,11 +587,15 @@
+               event->keyval == GDK_KP_Decimal ||
+               event->keyval == GDK_KP_Separator;
+ 
+-      if (gtk_im_context_filter_keypress (pane->im_context,event))
++      if (gtk_im_context_filter_keypress (pane->im_context, event))
+               return TRUE;
+-      pane->reseting_im = TRUE;
++
++      /* in gtk-2.8 something changed.  gtk_im_context_reset started
++       * triggering a pre-edit-changed.  We'd end up start and finishing an
++       * empty edit every time the cursor moved */
++      pane->im_block_edit_start = TRUE;
+       gtk_im_context_reset (pane->im_context);
+-      pane->reseting_im = FALSE;
++      pane->im_block_edit_start = FALSE;
+ 
+       if (gnm_pane_key_mode_sheet (pane, event, allow_rangesel))
+               return TRUE;
+@@ -628,7 +632,17 @@
+ gnm_pane_focus_in (GtkWidget *widget, GdkEventFocus *event)
+ {
+ #ifndef GNM_USE_HILDON
++      /* The first call to focus-in was sometimes the first thing to init the
++       * imcontext.  In which case the im_context_focus_in would fire a
++       * preedit-changed, and we would start editing. */
++      GnmPane *pane = GNM_PANE (widget);
++      if (pane->im_first_focus)
++              pane->im_block_edit_start = TRUE;
+       gtk_im_context_focus_in (GNM_PANE (widget)->im_context);
++      if (pane->im_first_focus) {
++              pane->im_first_focus = FALSE;
++              pane->im_block_edit_start = FALSE;
++      }
+ #endif
+       return (*GTK_WIDGET_CLASS (parent_klass)->focus_in_event) (widget, 
event);
+ }
+@@ -645,6 +659,8 @@
+ {
+       GtkStyle  *style;
+ 
++      GNM_PANE (w)->im_block_edit_start = FALSE;
++
+       if (GTK_WIDGET_CLASS (parent_klass)->realize)
+               (*GTK_WIDGET_CLASS (parent_klass)->realize) (w);
+ 
+@@ -667,8 +683,10 @@
+       pane = GNM_PANE (widget);
+       g_return_if_fail (pane != NULL);
+ 
+-      if (pane->im_context)
++      if (pane->im_context) {
++              pane->im_block_edit_start = TRUE;
+               gtk_im_context_set_client_window (pane->im_context, NULL);
++      }
+ 
+       (*GTK_WIDGET_CLASS (parent_klass)->unrealize)(widget);
+ }
+@@ -733,10 +751,7 @@
+               pango_attr_list_unref (pane->preedit_attrs);
+       gtk_im_context_get_preedit_string (pane->im_context, &preedit_string, 
&pane->preedit_attrs, &cursor_pos);
+ 
+-      /* in gtk-2.8 something changed.  gtk_im_context_reset started
+-       * triggering a pre-edit-changed.  We'd end up start and finishing an
+-       * empty edit every time the cursor moved */
+-      if (!pane->reseting_im &&
++      if (!pane->im_block_edit_start &&
+           !wbcg_is_editing (wbcg) && !wbcg_edit_start (wbcg, TRUE, TRUE)) {
+               gtk_im_context_reset (pane->im_context);
+               pane->preedit_length = 0;
+@@ -911,8 +926,9 @@
+ 
+       pane->im_context = gtk_im_multicontext_new ();
+       pane->preedit_length = 0;
+-      pane->preedit_attrs = NULL;
+-      pane->reseting_im = FALSE;
++      pane->preedit_attrs    = NULL;
++      pane->im_block_edit_start = FALSE;
++      pane->im_first_focus = TRUE;
+ 
+       GTK_WIDGET_SET_FLAGS (canvas, GTK_CAN_FOCUS);
+       GTK_WIDGET_SET_FLAGS (canvas, GTK_CAN_DEFAULT);
+@@ -2062,9 +2078,9 @@
+                       "width-pixels", 1,
+                       NULL);
+       else {
+-              static char const dat [] = { 0x22, 0x88, 0x22, 0x88, 0x22, 
0x88, 0x22, 0x88 };
++              static unsigned char const dat [] = { 0x22, 0x88, 0x22, 0x88, 
0x22, 0x88, 0x22, 0x88 };
+               GdkBitmap *stipple = gdk_bitmap_create_from_data (
+-                      GTK_WIDGET (pane)->window, dat, 8, 8);
++                      GTK_WIDGET (pane)->window, (const gchar *)dat, 8, 8);
+               foo_canvas_item_set (pane->size_guide.guide, "fill-stipple", 
stipple, NULL);
+               g_object_unref (stipple);
+       }
+--- gnumeric-1.8.4.orig/src/gnm-pane-impl.h
++++ gnumeric-1.8.4/src/gnm-pane-impl.h
+@@ -30,14 +30,13 @@
+       gboolean   sliding_adjacent_h, sliding_adjacent_v;
+ 
+       /*  IM */
+-      guint      reseting_im :1;      /* quick hack to keep 
gtk_im_context_reset from starting an edit */
++      guint im_block_edit_start :1; /* see gnm_pane_key_press for details */
++      guint im_first_focus      :1; /* see gnm_pane_init for details */
+       guint      preedit_length;
+       GtkIMContext  *im_context;
+       PangoAttrList *preedit_attrs;
+-      gboolean insert_decimal;
+-
+-
+ 
++      gboolean insert_decimal;
+ 
+       int              index;
+       struct {
+--- gnumeric-1.8.4.orig/src/gnm-plugin.c
++++ gnumeric-1.8.4/src/gnm-plugin.c
+@@ -363,7 +363,7 @@
+       PluginServiceUI *service_ui = GNM_PLUGIN_SERVICE_UI (service);
+       GError *err = NULL;
+       char *full_file_name;
+-      char *xml_ui;
++      char *xml_ui, *group_name;
+       char const *textdomain;
+ 
+       GO_INIT_RET_ERROR_INFO (ret_error);
+@@ -380,9 +380,11 @@
+       g_free (full_file_name);
+ 
+       textdomain = go_plugin_get_textdomain (service->plugin);
+-      service_ui->layout_id = gnm_app_add_extra_ui (
++      group_name = g_strconcat (go_plugin_get_id (service->plugin), 
service->id, NULL);
++      service_ui->layout_id = gnm_app_add_extra_ui (group_name,
+               service_ui->actions,
+               xml_ui, textdomain, service);
++      g_free (group_name);
+       service->is_active = TRUE;
+ }
+ 
+--- gnumeric-1.8.4.orig/src/application.c
++++ gnumeric-1.8.4/src/application.c
+@@ -815,12 +815,14 @@
+ }
+ 
+ GnmAppExtraUI *
+-gnm_app_add_extra_ui (GSList *actions, char *layout,
++gnm_app_add_extra_ui (char const *group_name,
++                    GSList *actions, char *layout,
+                     char const *domain,
+                     gpointer user_data)
+ {
+       GnmAppExtraUI *extra_ui = g_new0 (GnmAppExtraUI, 1);
+       extra_uis = g_slist_prepend (extra_uis, extra_ui);
++      extra_ui->group_name = g_strdup (group_name);
+       extra_ui->actions = actions;
+       extra_ui->layout = layout;
+       extra_ui->user_data = user_data;
+@@ -832,6 +834,8 @@
+ gnm_app_remove_extra_ui (GnmAppExtraUI *extra_ui)
+ {
+       g_signal_emit (G_OBJECT (app), signals [CUSTOM_UI_REMOVED], 0, 
extra_ui);
++      g_free (extra_ui->group_name);
++      g_free (extra_ui);
+ }
+ 
+ void
+

-- 
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to