From 4608d5b633d47c87e1956564807c3b6ca19eb50d Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 2 Sep 2025 14:16:41 +0300 Subject: [PATCH 1/5] fix: ensure null termination when converting string_view to string --- src/common/CvtFormat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/CvtFormat.cpp b/src/common/CvtFormat.cpp index 21e834cece5..c68abe3a6e4 100644 --- a/src/common/CvtFormat.cpp +++ b/src/common/CvtFormat.cpp @@ -1347,7 +1347,7 @@ namespace break; } if (strOffset >= strLength) - cb->err(Arg::Gds(isc_data_for_format_is_exhausted) << string(it->patternStr.data())); + cb->err(Arg::Gds(isc_data_for_format_is_exhausted) << string(it->patternStr.data(), it->patternStr.length())); std::string_view patternStr = it->patternStr; From 49b01df0cef2b9a2acd5dcb48ea183fa24d9f790 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 2 Sep 2025 14:19:36 +0300 Subject: [PATCH 2/5] fix: correcting the passing of arguments to a function and loop --- src/jrd/btr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/jrd/btr.cpp b/src/jrd/btr.cpp index bf010642fa1..6f0376f8367 100644 --- a/src/jrd/btr.cpp +++ b/src/jrd/btr.cpp @@ -5806,8 +5806,8 @@ static ULONG insert_node(thread_db* tdbb, // For checking on duplicate nodes we should find the first matching key. UCHAR* pointer = find_node_start_point(bucket, key, 0, &prefix, - idx->idx_flags & idx_descending, - false, true, validateDuplicates ? NO_VALUE : newRecordNumber); + (idx->idx_flags & idx_descending) != 0, + false ? 1 : 0, true, validateDuplicates ? NO_VALUE : newRecordNumber); if (!pointer) return NO_VALUE_PAGE; @@ -6620,8 +6620,8 @@ static contents remove_leaf_node(thread_db* tdbb, index_insertion* insertion, WI UCHAR* pointer; USHORT prefix; while (!(pointer = find_node_start_point(page, key, 0, &prefix, - (idx->idx_flags & idx_descending), - false, false, + (idx->idx_flags & idx_descending) != 0, + false ? 1 : 0, false, (validateDuplicates ? NO_VALUE : insertion->iib_number)))) { page = (btree_page*) CCH_HANDOFF(tdbb, window, page->btr_sibling, LCK_write, pag_index); From f43dd1a90a2e28f46fc789d6b4ce6444b81867cf Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 13 Dec 2025 13:40:31 +0300 Subject: [PATCH 3/5] fixed implicit type conversion errors --- src/jrd/btr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/jrd/btr.cpp b/src/jrd/btr.cpp index 6f0376f8367..9c17b5af151 100644 --- a/src/jrd/btr.cpp +++ b/src/jrd/btr.cpp @@ -5806,8 +5806,8 @@ static ULONG insert_node(thread_db* tdbb, // For checking on duplicate nodes we should find the first matching key. UCHAR* pointer = find_node_start_point(bucket, key, 0, &prefix, - (idx->idx_flags & idx_descending) != 0, - false ? 1 : 0, true, validateDuplicates ? NO_VALUE : newRecordNumber); + idx->idx_flags & idx_descending, + 0, true, validateDuplicates ? NO_VALUE : newRecordNumber); if (!pointer) return NO_VALUE_PAGE; @@ -6620,8 +6620,8 @@ static contents remove_leaf_node(thread_db* tdbb, index_insertion* insertion, WI UCHAR* pointer; USHORT prefix; while (!(pointer = find_node_start_point(page, key, 0, &prefix, - (idx->idx_flags & idx_descending) != 0, - false ? 1 : 0, false, + idx->idx_flags & idx_descending, + 0, false, (validateDuplicates ? NO_VALUE : insertion->iib_number)))) { page = (btree_page*) CCH_HANDOFF(tdbb, window, page->btr_sibling, LCK_write, pag_index); From ce202476977391933a37da5157f53a2cde396cf4 Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 14 Apr 2026 10:54:41 +0300 Subject: [PATCH 4/5] Added StringBase constructor from std::string_view --- src/common/CvtFormat.cpp | 2 +- src/common/classes/fb_string.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/common/CvtFormat.cpp b/src/common/CvtFormat.cpp index c68abe3a6e4..51d2f6b4d81 100644 --- a/src/common/CvtFormat.cpp +++ b/src/common/CvtFormat.cpp @@ -1347,7 +1347,7 @@ namespace break; } if (strOffset >= strLength) - cb->err(Arg::Gds(isc_data_for_format_is_exhausted) << string(it->patternStr.data(), it->patternStr.length())); + cb->err(Arg::Gds(isc_data_for_format_is_exhausted) << string(it->patternStr)); std::string_view patternStr = it->patternStr; diff --git a/src/common/classes/fb_string.h b/src/common/classes/fb_string.h index ab35992a33a..7d3684c5fac 100644 --- a/src/common/classes/fb_string.h +++ b/src/common/classes/fb_string.h @@ -689,6 +689,8 @@ namespace Firebird StringBase(const void* s, size_type n) : AbstractString(Comparator::getMaxLength(), n, s) {} StringBase(const_pointer s) : AbstractString(Comparator::getMaxLength(), static_cast(s ? strlen(s) : 0), s) {} + StringBase(std::string_view sv) : + AbstractString(Comparator::getMaxLength(), static_cast(sv.length()), sv.data()) {} explicit StringBase(const unsigned char* s) : AbstractString(Comparator::getMaxLength(), static_cast(strlen((char*)s)), (char*)s) {} StringBase(const MetaString& v) : AbstractString(Comparator::getMaxLength(), v) {} From 655aa5e419e3d375b146aeee862e79b3689bd50a Mon Sep 17 00:00:00 2001 From: Andrei Date: Tue, 14 Apr 2026 11:11:25 +0300 Subject: [PATCH 5/5] Merge branch 'fix_passing_arguments' - resolved conflict in StringBase constructors --- src/common/classes/fb_string.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/classes/fb_string.h b/src/common/classes/fb_string.h index 7d3684c5fac..1c8d4b993dd 100644 --- a/src/common/classes/fb_string.h +++ b/src/common/classes/fb_string.h @@ -691,6 +691,9 @@ namespace Firebird AbstractString(Comparator::getMaxLength(), static_cast(s ? strlen(s) : 0), s) {} StringBase(std::string_view sv) : AbstractString(Comparator::getMaxLength(), static_cast(sv.length()), sv.data()) {} + AbstractString(Comparator::getMaxLength(), s ? length(s) : 0, s) {} + StringBase(std::string_view sv) : + AbstractString(Comparator::getMaxLength(), static_cast(sv.length()), sv.data()) {} explicit StringBase(const unsigned char* s) : AbstractString(Comparator::getMaxLength(), static_cast(strlen((char*)s)), (char*)s) {} StringBase(const MetaString& v) : AbstractString(Comparator::getMaxLength(), v) {}