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