gnucash stable: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Sun Nov 30 18:25:06 EST 2025


Updated	 via  https://github.com/Gnucash/gnucash/commit/722a4555 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1cfda5a7 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/cdb9dfa0 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/3e4e3349 (commit)
	from  https://github.com/Gnucash/gnucash/commit/534bea74 (commit)



commit 722a45559321a0ab3d2568e6b959336b457ad034
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Nov 30 20:47:18 2025 +0800

    [guid.cpp] string->guid should disallow 'g' char
    
    off-by-1 error in alpha test. only 'a'-'f' should be allowed.

diff --git a/libgnucash/engine/guid.cpp b/libgnucash/engine/guid.cpp
index acf96ca35e..df4cd8d77a 100644
--- a/libgnucash/engine/guid.cpp
+++ b/libgnucash/engine/guid.cpp
@@ -92,7 +92,7 @@ char_to_num (unsigned char c) noexcept
 {
     unsigned int digit = c - '0';
     unsigned int alpha = (c | 0x20) - 'a';
-    return digit <= 9 ? digit : alpha <= 6 ? alpha + 10 : -1;
+    return digit <= 9 ? digit : alpha <= 5 ? alpha + 10 : -1;
 }
 
 static inline bool
diff --git a/libgnucash/engine/test/test-gnc-guid.cpp b/libgnucash/engine/test/test-gnc-guid.cpp
index 83916ebf1b..f991b2ee76 100644
--- a/libgnucash/engine/test/test-gnc-guid.cpp
+++ b/libgnucash/engine/test/test-gnc-guid.cpp
@@ -74,6 +74,13 @@ TEST (GncGUID, from_string)
     guid = gnc::GUID::create_random ();
     std::string bogus {"Have a great big roast beef sandwich, if you please!"};
     EXPECT_THROW (gnc::GUID::from_string (bogus), gnc::guid_syntax_exception);
+
+    std::string test1 {"0123456789abcdef0123456789abcdef"};
+    auto guid1 = gnc::GUID::from_string (test1);
+    EXPECT_EQ (test1, guid1.to_string());
+
+    std::string test2 {"0123456789abcdef0123456789abcdeg"};
+    EXPECT_THROW (gnc::GUID::from_string (test2), gnc::guid_syntax_exception);
 }
 
 TEST (GncGUID, round_trip)

commit 1cfda5a71a0255721ab97d928575ad5b80ea39b8
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Nov 30 20:45:14 2025 +0800

    [test-gnc-guid.cpp] use EXPECT_THROW
    
    instead of try..catch

diff --git a/libgnucash/engine/test/test-gnc-guid.cpp b/libgnucash/engine/test/test-gnc-guid.cpp
index d957888f20..83916ebf1b 100644
--- a/libgnucash/engine/test/test-gnc-guid.cpp
+++ b/libgnucash/engine/test/test-gnc-guid.cpp
@@ -73,17 +73,7 @@ TEST (GncGUID, from_string)
 
     guid = gnc::GUID::create_random ();
     std::string bogus {"Have a great big roast beef sandwich, if you please!"};
-    bool fail = false;
-    try
-    {
-        gnc::GUID::from_string (bogus);
-    }
-    catch (gnc::guid_syntax_exception const &)
-    {
-        fail = true;
-    }
-
-    EXPECT_TRUE (fail) << "Parsing the bogus string should throw";
+    EXPECT_THROW (gnc::GUID::from_string (bogus), gnc::guid_syntax_exception);
 }
 
 TEST (GncGUID, round_trip)

commit cdb9dfa0eeb61d75f1ff78f0cb406072d7fd4ca2
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Nov 30 20:48:28 2025 +0800

    [guid.cpp] fast_string_to_guid: -1<<4 is UB, fix UB
    
    when parsing invalid chars, hi|lo would return -1. convert to unsigned
    to avoid UB.

diff --git a/libgnucash/engine/guid.cpp b/libgnucash/engine/guid.cpp
index bebd4b8ae4..acf96ca35e 100644
--- a/libgnucash/engine/guid.cpp
+++ b/libgnucash/engine/guid.cpp
@@ -105,7 +105,7 @@ fast_string_to_guid (const char* s, uint8_t* out) noexcept
         int hi = char_to_num (*s++);
         int lo = char_to_num (*s++);
         all_ok &= (hi >= 0 && lo >= 0);
-        out[i] = (unsigned char)((hi << 4) | lo);
+        out[i] = (unsigned char)(((unsigned)hi << 4) | (unsigned)lo);
     }
     return all_ok;
 }

commit 3e4e3349440106c66356f47abcf103a568eadffe
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sun Nov 30 20:47:54 2025 +0800

    [guid.cpp] string->guid: parse into uuid data, avoids memcpy

diff --git a/libgnucash/engine/guid.cpp b/libgnucash/engine/guid.cpp
index 0fd36fd3d7..bebd4b8ae4 100644
--- a/libgnucash/engine/guid.cpp
+++ b/libgnucash/engine/guid.cpp
@@ -368,13 +368,8 @@ GUID::from_string (const char* str)
     if (!str)
         throw guid_syntax_exception {};
 
-    uint8_t bytes[16];
-    if (fast_string_to_guid(str, bytes))
-    {
-        boost::uuids::uuid u;
-        std::memcpy(u.data, bytes, 16);
-        return GUID{u};
-    }
+    if (boost::uuids::uuid u; fast_string_to_guid(str, u.data))
+        return u;
     try
     {
         static boost::uuids::string_generator strgen;



Summary of changes:
 libgnucash/engine/guid.cpp               | 13 ++++---------
 libgnucash/engine/test/test-gnc-guid.cpp | 17 +++++++----------
 2 files changed, 11 insertions(+), 19 deletions(-)



More information about the gnucash-changes mailing list