r14889 - gnucash/branches/2.0 - Avoid crash from opening transaction in more than one register. Bug #347089.

Derek Atkins warlord at cvs.gnucash.org
Sat Sep 23 19:46:20 EDT 2006


Author: warlord
Date: 2006-09-23 19:46:19 -0400 (Sat, 23 Sep 2006)
New Revision: 14889
Trac: http://svn.gnucash.org/trac/changeset/14889

Modified:
   gnucash/branches/2.0/
   gnucash/branches/2.0/ChangeLog
   gnucash/branches/2.0/src/register/ledger-core/split-register-control.c
   gnucash/branches/2.0/src/register/ledger-core/split-register.c
   gnucash/branches/2.0/src/register/ledger-core/split-register.h
Log:
   Avoid crash from opening transaction in more than one register. Bug #347089.
   In any case where we might be opening the transaction and marking it as the
   pending transaction, check first if it's already open.  If it is, we assume
   that it's being edited by another register.  We report the error and abort
   the action that would have opened the transaction.
   suspend events around the Commit().

(approved by warlord and chris)
Merge from r14495 and r14887.




Property changes on: gnucash/branches/2.0
___________________________________________________________________
Name: svk:merge
   - d2ab10a8-8a95-4986-baff-8d511d9f15b2:/local/gnucash/branches/2.0:13336
d2ab10a8-8a95-4986-baff-8d511d9f15b2:/local/gnucash/trunk:13282
   + d2ab10a8-8a95-4986-baff-8d511d9f15b2:/local/gnucash/branches/2.0:13346
d2ab10a8-8a95-4986-baff-8d511d9f15b2:/local/gnucash/trunk:13282

Modified: gnucash/branches/2.0/ChangeLog
===================================================================
--- gnucash/branches/2.0/ChangeLog	2006-09-23 22:51:29 UTC (rev 14888)
+++ gnucash/branches/2.0/ChangeLog	2006-09-23 23:46:19 UTC (rev 14889)
@@ -1,3 +1,17 @@
+2006-09-23  Derek Atkins  <derek at ihtfp.com>
+
+	* src/ledger-core/split-register*.c:
+	  suspend events around the Commit(). Fixes #347089 when combined
+	  with r14495.
+
+2006-08-22  Chris Shoemaker <chris.shoemaker at cox.net>
+
+   Avoid crash from opening transaction in more than one register. Bug #347089.
+   In any case where we might be opening the transaction and marking it as the
+   pending transaction, check first if it's already open.  If it is, we assume
+   that it's being edited by another register.  We report the error and abort
+   the action that would have opened the transaction.
+	
 2006-09-19  Andreas Köhler  <andi5.py at gmx.net>
 
 	* src/backend/file/gnc-backend-file.c:

Modified: gnucash/branches/2.0/src/register/ledger-core/split-register-control.c
===================================================================
--- gnucash/branches/2.0/src/register/ledger-core/split-register-control.c	2006-09-23 22:51:29 UTC (rev 14888)
+++ gnucash/branches/2.0/src/register/ledger-core/split-register-control.c	2006-09-23 23:46:19 UTC (rev 14889)
@@ -674,17 +674,19 @@
         if (auto_trans == NULL)
           return FALSE;
 
+	gnc_suspend_gui_refresh ();
+
         /* now perform the completion */
+        if ((pending_trans != NULL) && (pending_trans != trans)) {
+            if (gnc_split_register_begin_edit_or_warn(info, trans))
+	    {
+	        gnc_resume_gui_refresh ();
+                return TRUE;
+	    }
 
-        gnc_suspend_gui_refresh ();
-
-        info->pending_trans_guid = *xaccTransGetGUID(trans);
-        if ((pending_trans != NULL) && (pending_trans != trans)) {
             if (xaccTransIsOpen (pending_trans))
                 xaccTransCommitEdit (pending_trans);
             else g_assert_not_reached();
-            g_assert(!xaccTransIsOpen(trans));
-            xaccTransBeginEdit(trans);
         }
         g_assert(xaccTransIsOpen(trans));
         pending_trans = trans;

Modified: gnucash/branches/2.0/src/register/ledger-core/split-register.c
===================================================================
--- gnucash/branches/2.0/src/register/ledger-core/split-register.c	2006-09-23 22:51:29 UTC (rev 14888)
+++ gnucash/branches/2.0/src/register/ledger-core/split-register.c	2006-09-23 23:46:19 UTC (rev 14889)
@@ -143,6 +143,24 @@
   return denom;
 }
 
+/* returns TRUE if begin_edit was aborted */
+gboolean
+gnc_split_register_begin_edit_or_warn(SRInfo *info, Transaction *trans)
+{
+      if (!xaccTransIsOpen(trans)) {
+          xaccTransBeginEdit(trans);
+          /* This is now the pending transaction */
+          info->pending_trans_guid = *xaccTransGetGUID(trans);
+          return FALSE;
+      } else {
+          GtkWidget *parent = NULL;
+          if (info->get_parent)
+              parent = info->get_parent(info->user_data);
+          gnc_error_dialog(parent, "%s", _("This transaction is already being edited in another register. Please finish editing it there first."));
+          return TRUE;
+      }
+}
+
 void
 gnc_split_register_expand_current_trans (SplitRegister *reg, gboolean expand)
 {
@@ -829,9 +847,8 @@
       g_assert(xaccTransIsOpen(trans));
   } else {
       g_assert(!pending_trans);
-      g_assert(!xaccTransIsOpen(trans));
-      xaccTransBeginEdit(trans);
-      info->pending_trans_guid = *xaccTransGetGUID(trans);
+      if (gnc_split_register_begin_edit_or_warn(info, trans))
+          return;
   }
   xaccSplitDestroy (split);
 
@@ -1001,10 +1018,8 @@
 
   trans = xaccSplitGetParent(split);
   if (!pending) {
-      g_assert(!xaccTransIsOpen(trans));
-      xaccTransBeginEdit(trans);
-      /* This is now the pending transaction */
-      info->pending_trans_guid = *xaccTransGetGUID(trans);
+      if (gnc_split_register_begin_edit_or_warn(info, trans))
+          return;
   } else if (pending == trans) {
       g_assert(xaccTransIsOpen(trans));
   } else g_assert_not_reached();
@@ -1359,7 +1374,6 @@
        // FIXME: How could the pending transaction not be open?
        // FIXME: For that matter, how could an open pending
        // transaction ever not be the current trans?
-       info->pending_trans_guid = *xaccTransGetGUID(trans);
        if (xaccTransIsOpen (pending_trans)) {
            g_message("Impossible? commiting pending %p", pending_trans);
            xaccTransCommitEdit (pending_trans);
@@ -1371,10 +1385,15 @@
            g_assert(xaccTransIsOpen(blank_trans));
        } else {
            PINFO("beginning edit of trans %p", trans);
-           xaccTransBeginEdit (trans);
+           if (gnc_split_register_begin_edit_or_warn(info, trans))
+	   {
+	       gnc_resume_gui_refresh ();
+               return FALSE;
+	   }
        }
        pending_trans = trans;
    }
+   g_assert(xaccTransIsOpen(trans));
 
    /* If we are committing the blank split, add it to the account now */
    if (trans == blank_trans)

Modified: gnucash/branches/2.0/src/register/ledger-core/split-register.h
===================================================================
--- gnucash/branches/2.0/src/register/ledger-core/split-register.h	2006-09-23 22:51:29 UTC (rev 14888)
+++ gnucash/branches/2.0/src/register/ledger-core/split-register.h	2006-09-23 23:46:19 UTC (rev 14889)
@@ -431,6 +431,10 @@
 gboolean
 gnc_split_register_handle_exchange (SplitRegister *reg, gboolean force_dialog);
 
+/* returns TRUE if begin_edit was aborted */
+gboolean
+gnc_split_register_begin_edit_or_warn(SRInfo *info, Transaction *trans);
+
 /** @} */
 /** @} */
 /* -------------------------------------------------------------- */



More information about the gnucash-changes mailing list