gnucash maint: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Tue May 27 16:29:54 EDT 2014


Updated	 via  https://github.com/Gnucash/gnucash/commit/1f303f7b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/7daad042 (commit)
	from  https://github.com/Gnucash/gnucash/commit/75114b7c (commit)



commit 1f303f7b81a5dd5e9e1b71871b4c023623109a77
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue May 27 14:19:27 2014 -0700

    More fix-ups for the renumber subaccounts dialog.
    
    Add more invariant checks for safety.
    Suppress the '-' in the account-number format if the prefix is empty.
    Set the value for the interval GtkSpinButton so that it won't be 0 on startup.
    Fix the step-increment and page-increment property names in the builder file
    so that they have an effect.

diff --git a/src/gnome-utils/dialog-account.c b/src/gnome-utils/dialog-account.c
index 60f063b..8e7bff3 100644
--- a/src/gnome-utils/dialog-account.c
+++ b/src/gnome-utils/dialog-account.c
@@ -1904,18 +1904,28 @@ gnc_account_renumber_update_examples (RenumberDialog *data)
     gint interval;
     unsigned int num_digits = 1;
 
+    g_return_if_fail (data->num_children > 0);
     prefix = gtk_editable_get_chars(GTK_EDITABLE(data->prefix), 0, -1);
     interval = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->interval));
     if (interval <= 0)
 	interval = 10;
     num_digits = (unsigned int)log10((double)(data->num_children * interval)) + 1;
 
-    str = g_strdup_printf("%s-%0*d", prefix, num_digits, interval);
+    if (strlen (prefix))
+	str = g_strdup_printf("%s-%0*d", prefix, num_digits, interval);
+    else
+	str = g_strdup_printf("%0*d", num_digits, interval);
+
     gtk_label_set_text(GTK_LABEL(data->example1), str);
     g_free(str);
 
-    str = g_strdup_printf("%s-%0*d", prefix, num_digits,
-                          interval * data->num_children);
+    if (strlen (prefix))
+	str = g_strdup_printf("%s-%0*d", prefix, num_digits,
+			      interval * data->num_children);
+    else
+	str = g_strdup_printf("%0*d", num_digits,
+			      interval * data->num_children);
+
     gtk_label_set_text(GTK_LABEL(data->example2), str);
     g_free(str);
 
@@ -1941,7 +1951,7 @@ gnc_account_renumber_response_cb (GtkDialog *dialog,
                                   gint response,
                                   RenumberDialog *data)
 {
-    GList *children, *tmp;
+    GList *children = NULL, *tmp;
     gchar *str;
     gchar *prefix;
     gint interval;
@@ -1951,10 +1961,15 @@ gnc_account_renumber_response_cb (GtkDialog *dialog,
     {
         gtk_widget_hide(data->dialog);
         children = gnc_account_get_children_sorted(data->parent);
+	if (children == NULL)
+	{
+	    PWARN ("Can't renumber children of an account with no children!");
+	    g_free (data);
+	    return;
+	}
         prefix = gtk_editable_get_chars(GTK_EDITABLE(data->prefix), 0, -1);
         interval =
             gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->interval));
-        num_digits = log10(data->num_children * interval) + 1;
 	if (interval <= 0)
 	    interval = 10;
         num_digits = (unsigned int)log10 ((double)(data->num_children * interval) + 1);
@@ -1962,7 +1977,11 @@ gnc_account_renumber_response_cb (GtkDialog *dialog,
         gnc_set_busy_cursor (NULL, TRUE);
         for (tmp = children, i = 1; tmp; tmp = g_list_next(tmp), i += 1)
         {
-            str = g_strdup_printf("%s-%0*d", prefix, num_digits, interval * i);
+	    if (strlen (prefix))
+		str = g_strdup_printf("%s-%0*d", prefix,
+				      num_digits, interval * i);
+	    else
+		str = g_strdup_printf("%0*d", num_digits, interval * i);
             xaccAccountSetCode(tmp->data, str);
             g_free(str);
         }
@@ -1982,16 +2001,24 @@ gnc_account_renumber_create_dialog (GtkWidget *window, Account *account)
     GtkWidget *widget;
     gchar *string;
 
+    /* This is a safety check; the menu item calling this dialog
+     * should be disabled if the account has no children.
+     */
+    g_return_if_fail (gnc_account_n_children (account) > 0);
     data = g_new(RenumberDialog, 1);
     data->parent = account;
     data->num_children = gnc_account_n_children(account);
 
     builder = gtk_builder_new();
-    gnc_builder_add_from_file (builder, "dialog-account.glade", "interval_adjustment");
-    gnc_builder_add_from_file (builder, "dialog-account.glade", "Renumber Accounts");
-    data->dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Renumber Accounts"));
+    gnc_builder_add_from_file (builder, "dialog-account.glade",
+			       "interval_adjustment");
+    gnc_builder_add_from_file (builder, "dialog-account.glade",
+			       "Renumber Accounts");
+    data->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
+						      "Renumber Accounts"));
     gtk_window_set_transient_for(GTK_WINDOW(data->dialog), GTK_WINDOW(window));
-    g_object_set_data_full(G_OBJECT(data->dialog), "builder", builder, g_object_unref);
+    g_object_set_data_full(G_OBJECT(data->dialog), "builder", builder,
+			   g_object_unref);
 
     widget = GTK_WIDGET(gtk_builder_get_object (builder, "header_label"));
     string = g_strdup_printf(_( "Renumber the immediate sub-accounts of %s? "
diff --git a/src/gnome-utils/gtkbuilder/dialog-account.glade b/src/gnome-utils/gtkbuilder/dialog-account.glade
index e8faf8e..d77ea9e 100644
--- a/src/gnome-utils/gtkbuilder/dialog-account.glade
+++ b/src/gnome-utils/gtkbuilder/dialog-account.glade
@@ -1600,6 +1600,7 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="adjustment">interval_adjustment</property>
+		<property name="value">10</property>
                 <property name="climb_rate">1</property>
                 <signal name="value_changed" handler="gnc_account_renumber_interval_changed_cb"/>
               </object>
@@ -1719,7 +1720,7 @@
     <property name="value">10</property>
     <property name="lower">1</property>
     <property name="upper">10000</property>
-    <property name="step_increment">5</property>
-    <property name="page_increment">100</property>
+    <property name="step-increment">5</property>
+    <property name="page-increment">100</property>
   </object>
 </interface>

commit 7daad042d0b5e426d0c5153d71abf69bd071fd4b
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue May 27 14:15:41 2014 -0700

    Bug 725054 - Re-numbering sub accounts crashes the program
    
    g_strdup_printf ("%s-%0*d", prefix, num_digits, interval) calls malloc()
    with the number of required characters, which includes num_digits characters
    for the numeric. If the interval is 0, log10(num_children * interval) is
    log10(0), which returns NAN (not a number), which when cast to size_t is
    MAXINT. That generates a malloc error, which crashes GnuCash.
    
    So don't let the interval be 0.

diff --git a/src/gnome-utils/dialog-account.c b/src/gnome-utils/dialog-account.c
index 7e590d5..60f063b 100644
--- a/src/gnome-utils/dialog-account.c
+++ b/src/gnome-utils/dialog-account.c
@@ -1901,11 +1901,14 @@ gnc_account_renumber_update_examples (RenumberDialog *data)
 {
     gchar *str;
     gchar *prefix;
-    gint interval, num_digits;
+    gint interval;
+    unsigned int num_digits = 1;
 
     prefix = gtk_editable_get_chars(GTK_EDITABLE(data->prefix), 0, -1);
     interval = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->interval));
-    num_digits = log10(data->num_children * interval) + 1;
+    if (interval <= 0)
+	interval = 10;
+    num_digits = (unsigned int)log10((double)(data->num_children * interval)) + 1;
 
     str = g_strdup_printf("%s-%0*d", prefix, num_digits, interval);
     gtk_label_set_text(GTK_LABEL(data->example1), str);
@@ -1941,7 +1944,8 @@ gnc_account_renumber_response_cb (GtkDialog *dialog,
     GList *children, *tmp;
     gchar *str;
     gchar *prefix;
-    gint interval, num_digits, i;
+    gint interval;
+    unsigned int num_digits, i;
 
     if (response == GTK_RESPONSE_OK)
     {
@@ -1951,6 +1955,9 @@ gnc_account_renumber_response_cb (GtkDialog *dialog,
         interval =
             gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(data->interval));
         num_digits = log10(data->num_children * interval) + 1;
+	if (interval <= 0)
+	    interval = 10;
+        num_digits = (unsigned int)log10 ((double)(data->num_children * interval) + 1);
 
         gnc_set_busy_cursor (NULL, TRUE);
         for (tmp = children, i = 1; tmp; tmp = g_list_next(tmp), i += 1)



Summary of changes:
 src/gnome-utils/dialog-account.c                | 60 +++++++++++++++++++------
 src/gnome-utils/gtkbuilder/dialog-account.glade |  5 ++-
 2 files changed, 50 insertions(+), 15 deletions(-)



More information about the gnucash-changes mailing list