Merge branch 'plug-scm-to-utf8-string-leaks' into stable #1599

This commit is contained in:
Christopher Lam 2023-04-05 08:25:58 +08:00
commit 5236f33709
3 changed files with 58 additions and 28 deletions

View File

@ -413,23 +413,25 @@ scm_to_value<gnc_commodity*>(SCM new_value)
if (scm_is_list(new_value))
{
auto len{scm_to_uint(scm_length(new_value))};
std::string mnemonic{scm_to_utf8_string(scm_list_ref(new_value,
scm_from_uint(0)))};
std::string name_space{"CURRENCY"};
if (len > 1)
name_space = scm_to_utf8_string(scm_list_ref(new_value,
scm_from_uint(1)));
auto mnemonic{scm_to_utf8_string(scm_list_ref(new_value, scm_from_uint(0)))};
auto name_space{(len > 1) ? scm_to_utf8_string(scm_list_ref(new_value,
scm_from_uint(1)))
: strdup ("CURRENCY")};
auto book{get_current_book()};
auto table = gnc_commodity_table_get_table(book);
return gnc_commodity_table_lookup(table, name_space.c_str(),
mnemonic.c_str());
auto rv = gnc_commodity_table_lookup (table, name_space, mnemonic);
free (name_space);
free (mnemonic);
return rv;
}
if (scm_is_string(new_value))
{
auto book{get_current_book()};
auto table = gnc_commodity_table_get_table(book);
std::string mnemonic{scm_to_utf8_string(new_value)};
return gnc_commodity_table_lookup(table, "CURRENCY", mnemonic.c_str());
auto mnemonic{scm_to_utf8_string(new_value)};
auto rv = gnc_commodity_table_lookup(table, "CURRENCY", mnemonic);
free (mnemonic);
return rv;
}
return nullptr;
}
@ -483,6 +485,7 @@ scm_to_value<GncOptionAccountList>(SCM new_value)
GncGUID guid;
string_to_guid(guid_str, &guid);
retval.push_back(guid);
free (guid_str);
}
else
{
@ -635,9 +638,11 @@ gnc_option_test_book_destroy(QofBook* book)
}
else
throw std::invalid_argument("Unsupported key type in multichoice option.");
std::string key{scm_to_utf8_string(keyval)};
std::string name{scm_to_utf8_string(SCM_SIMPLE_VECTOR_REF(vec, 1))};
choices.push_back({std::move(key), std::move(name), keytype});
auto key{scm_to_utf8_string(keyval)};
auto name{scm_to_utf8_string(SCM_SIMPLE_VECTOR_REF(vec, 1))};
choices.push_back({key, name, keytype});
free (name);
free (key);
}
$1 = &choices;
}
@ -928,12 +933,15 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB);
if (scm_is_symbol(scm_car(date)))
{
auto car{scm_to_utf8_string(scm_symbol_to_string(scm_car(date)))};
bool rv = false;
if (strcmp(car, "relative") == 0)
return false;
if (strcmp(car, "absolute") == 0)
return true;
assert(false);
rv = false;
else if (strcmp(car, "absolute") == 0)
rv = true;
else
assert(false);
free (car);
return rv;
}
else
{
@ -985,7 +993,7 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB);
const GncOptionMultichoiceValue& option)
{
static const auto uint16_t_max = std::numeric_limits<uint16_t>::max();
auto scm_to_str = [](auto item)->const char* {
auto scm_to_str = [](auto item)->char* {
static const char* empty{""};
if (scm_is_integer(item))
item = scm_number_to_string(item, scm_from_uint(10u));
@ -993,7 +1001,7 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB);
item = scm_symbol_to_string(item);
if (scm_is_string(item))
return scm_to_utf8_string(item);
return empty;
return strdup(empty);
};
GncMultichoiceOptionIndexVec vec;
auto choice_is_list{option.get_ui_type() == GncOptionUIType::LIST};
@ -1005,14 +1013,18 @@ wrap_unique_ptr(GncOptionDBPtr, GncOptionDB);
for (std::size_t i = 0; i < len; ++i)
{
auto item{scm_list_ref(new_value, scm_from_size_t(i))};
auto index{option.permissible_value_index(scm_to_str(item))};
auto item_str{scm_to_str(item)};
auto index{option.permissible_value_index(item_str)};
free (item_str);
if (index < uint16_t_max)
vec.push_back(index);
}
}
else
{
auto index{option.permissible_value_index(scm_to_str(new_value))};
auto newval_str{scm_to_str(new_value)};
auto index{option.permissible_value_index(newval_str)};
free (newval_str);
if (index < uint16_t_max)
vec.push_back(index);
}
@ -1396,6 +1408,7 @@ inline SCM return_scm_value(ValueType value)
{
auto strval{scm_to_utf8_string(new_value)};
option.deserialize(strval);
free (strval);
return;
}
option.set_value(scm_to_value<gnc_commodity*>(new_value));
@ -1405,13 +1418,18 @@ inline SCM return_scm_value(ValueType value)
if (len > 1)
{
auto revlist{scm_reverse(new_value)};
std::string name_space{scm_to_utf8_string(scm_cadr(revlist))};
std::string mnemonic{scm_to_utf8_string(scm_car(revlist))};
option.deserialize(name_space + ":" + mnemonic);
auto name_space{scm_to_utf8_string(scm_cadr(revlist))};
auto mnemonic{scm_to_utf8_string(scm_car(revlist))};
option.deserialize(std::string (name_space) + ":" +
std::string (mnemonic));
free (mnemonic);
free (name_space);
}
else
{
option.deserialize(scm_to_utf8_string(scm_car(new_value)));
auto newval_str{scm_to_utf8_string(scm_car(new_value))};
option.deserialize(newval_str);
free (newval_str);
}
return;
}
@ -1422,6 +1440,7 @@ inline SCM return_scm_value(ValueType value)
auto strval{scm_to_utf8_string(new_value)};
auto val{qof_instance_from_string(strval, option.get_ui_type())};
option.set_value(val);
free (strval);
}
else
{
@ -1439,6 +1458,7 @@ inline SCM return_scm_value(ValueType value)
auto strval{scm_to_utf8_string(scm_cdr(new_value))};
owner.owner.undefined = qof_instance_from_string(strval, option.get_ui_type());
option.set_value(&owner);
free (strval);
}
else
{
@ -1472,6 +1492,7 @@ inline SCM return_scm_value(ValueType value)
string_to_guid(strval, &guid);
auto book{get_current_book()};
option.set_value(xaccAccountLookup(&guid, book));
free (strval);
}
else
{
@ -1536,6 +1557,7 @@ inline SCM return_scm_value(ValueType value)
auto strval{scm_to_utf8_string(new_value)};
auto val{qof_instance_from_string(strval, option.get_ui_type())};
option.set_default_value(val);
free (strval);
}
else
{
@ -1553,6 +1575,7 @@ inline SCM return_scm_value(ValueType value)
auto strval{scm_to_utf8_string(scm_cdr(new_value))};
owner.owner.undefined = qof_instance_from_string(strval, option.get_ui_type());
option.set_default_value(&owner);
free (strval);
}
else
{
@ -1585,6 +1608,7 @@ inline SCM return_scm_value(ValueType value)
string_to_guid(strval, &guid);
auto book{get_current_book()};
option.set_default_value(xaccAccountLookup(&guid, book));
free (strval);
}
else
{

View File

@ -472,11 +472,12 @@ custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar *
if (scm_is_true (scm_call_2 (unique_name_func, guid, new_name_scm)))
{
gchar *default_guid = gnc_get_default_invoice_print_report ();
gchar *guid_string = scm_to_utf8_string (guid);
custom_report_edit_report_name (guid, crd, new_text);
// check to see if default report name has been changed
if (g_strcmp0 (default_guid, scm_to_utf8_string (guid)) == 0)
if (g_strcmp0 (default_guid, guid_string) == 0)
{
QofBook *book = gnc_get_current_book ();
gchar *default_name = qof_book_get_default_invoice_report_name (book);
@ -485,6 +486,7 @@ custom_report_name_edited_cb(GtkCellRendererText *renderer, gchar *path, gchar *
qof_book_set_default_invoice_report (book, default_guid, new_text);
g_free (default_name);
}
g_free (guid_string);
g_free (default_guid);
}
else

View File

@ -115,7 +115,11 @@ get_available_reports ()
StrVec sv;
auto scm_list{scm_call_0(scm_c_eval_string("gnc:all-report-template-guids"))};
for (auto next{scm_list}; !scm_is_null(next); next = scm_cdr(next))
sv.emplace_back(scm_to_utf8_string(scm_car(next)));
{
auto guid{scm_to_utf8_string(scm_car(next))};
sv.emplace_back(guid);
g_free (guid);
}
return sv;
}