gnucash stable: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Mon Sep 18 17:20:42 EDT 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/a8c3b4b0 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ee849382 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/63f1b305 (commit)
	from  https://github.com/Gnucash/gnucash/commit/c930fd07 (commit)



commit a8c3b4b078a9b6e8969c198b3d4b06128097e05b
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Sep 18 14:14:03 2023 -0700

    Revert "[assistant-stock-transaction] refresh_handler: avoid leaking GList*"
    
    macOS clang optimizes away the return value so g_hash_table_find always
    returns the item pointer, causing premature destruction when a
    GncAccountSel-created account edit dialog completes, leading to a
    use-after-free crash.

diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp
index 47e3c71156..f4efeea365 100644
--- a/gnucash/gnome/assistant-stock-transaction.cpp
+++ b/gnucash/gnome/assistant-stock-transaction.cpp
@@ -2655,12 +2655,6 @@ stock_assistant_cancel_cb (GtkAssistant *assistant, gpointer user_data)
 }
 
 
-static bool
-is_destroying (gpointer key, EventInfo* change, gpointer user_data)
-{
-    return (change->event_mask & QOF_EVENT_DESTROY);
-};
-
 static void
 refresh_handler (GHashTable *changes, gpointer user_data)
 {
@@ -2671,12 +2665,18 @@ refresh_handler (GHashTable *changes, gpointer user_data)
  * should be only one entry, so just get the value and see if it
  * matches QOF_EVENT_DESTROY.
  */
-    if (g_hash_table_find (changes, (GHRFunc)is_destroying, nullptr))
+    auto list = g_hash_table_get_values(changes);
+    for (auto node = list; node; node = g_list_next(node))
     {
-        PWARN ("Stock account destroyed, cancelling assistant.");
-        auto controller = static_cast<StockAssistantController*>(user_data);
-        gnc_close_gui_component_by_data(ASSISTANT_STOCK_TRANSACTION_CM_CLASS, controller);
+        auto change{static_cast<EventInfo*>(node->data)};
+        if (change->event_mask & QOF_EVENT_DESTROY)
+        {
+            PWARN ("Stock account destroyed, cancelling assistant.");
+            auto controller = static_cast<StockAssistantController*>(user_data);
+            gnc_close_gui_component_by_data(ASSISTANT_STOCK_TRANSACTION_CM_CLASS, controller);
+        }
     }
+    g_list_free (list);
 }
 
 static void

commit ee84938276bf90c63e46d5b7e21132019671890f
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Sep 18 13:52:12 2023 -0700

    [stock-txn-asst] Reset entry amount/value to GNC_ERROR_ARG.
    
    When the entry has been set to a number and is later unset.

diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp
index d4215c493c..47e3c71156 100644
--- a/gnucash/gnome/assistant-stock-transaction.cpp
+++ b/gnucash/gnome/assistant-stock-transaction.cpp
@@ -631,7 +631,10 @@ void
 StockTransactionEntry::set_value(gnc_numeric amount)
 {
     if (gnc_numeric_check (amount))
+    {
+        m_value = gnc_numeric_error(GNC_ERROR_ARG);
         return;
+    }
 
     if (gnc_numeric_negative_p (amount))
     {
@@ -794,7 +797,10 @@ void
 StockTransactionStockEntry::set_amount(gnc_numeric amount)
 {
      if (!m_amount_enabled || gnc_numeric_check(amount))
-        return;
+     {
+         m_amount = gnc_numeric_error(GNC_ERROR_ARG);
+         return;
+     }
 
     if (m_input_new_balance)
     {

commit 63f1b305caee9a0b67dad022b51a2d12bfee8cf7
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Sep 18 11:47:15 2023 -0700

    [stock-txn-asst] Fix exception converting GNC_ERROR_ARG to GncNumeric.

diff --git a/gnucash/gnome/assistant-stock-transaction.cpp b/gnucash/gnome/assistant-stock-transaction.cpp
index a3de8994d3..d4215c493c 100644
--- a/gnucash/gnome/assistant-stock-transaction.cpp
+++ b/gnucash/gnome/assistant-stock-transaction.cpp
@@ -556,7 +556,7 @@ public:
     virtual void set_memo(const char* memo) { m_memo = memo; }
     virtual const char* memo() const { return m_memo; }
     virtual void set_value(gnc_numeric amount);
-    virtual GncNumeric value() { return GncNumeric(m_value); }
+    virtual GncNumeric value() { return (gnc_numeric_check(m_value) ? GncNumeric{} : GncNumeric(m_value)); }
     virtual void set_amount(gnc_numeric) {}
     virtual gnc_numeric amount() const { return m_value; }
     virtual bool has_amount() const { return false; }



Summary of changes:
 gnucash/gnome/assistant-stock-transaction.cpp | 30 ++++++++++++++++-----------
 1 file changed, 18 insertions(+), 12 deletions(-)



More information about the gnucash-changes mailing list