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