Guard against double-freeing of report objects
This commit is contained in:
parent
b3e21e8ae2
commit
dc9ecc600a
2 changed files with 59 additions and 34 deletions
|
|
@ -1386,8 +1386,8 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
switch (*p) {
|
||||
case 'a':
|
||||
if (is_eq(p, "accounts")) {
|
||||
return WRAP_FUNCTOR(reporter<>(new report_accounts(*this), *this,
|
||||
"#accounts"));
|
||||
return WRAP_FUNCTOR(reporter<>(post_handler_ptr(new report_accounts(*this)),
|
||||
*this, "#accounts"));
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -1395,9 +1395,10 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
if (*(p + 1) == '\0' || is_eq(p, "bal") || is_eq(p, "balance")) {
|
||||
return expr_t::op_t::wrap_functor
|
||||
(reporter<account_t, acct_handler_ptr, &report_t::accounts_report>
|
||||
(new format_accounts(*this, report_format(HANDLER(balance_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t()),
|
||||
(acct_handler_ptr(new format_accounts
|
||||
(*this, report_format(HANDLER(balance_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t())),
|
||||
*this, "#balance"));
|
||||
}
|
||||
else if (is_eq(p, "budget")) {
|
||||
|
|
@ -1407,11 +1408,24 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
if (! (budget_flags & ~BUDGET_WRAP_VALUES))
|
||||
budget_flags |= BUDGET_BUDGETED;
|
||||
|
||||
#if 0
|
||||
#define POSTS_REPORT(formatter)
|
||||
return WRAP_FUNCTOR(reporter<>(post_handler_ptr(formatter), *this,
|
||||
string("#") + p));
|
||||
|
||||
#define ACCOUNTS_REPORT(formatter)
|
||||
return WRAP_FUNCTOR(reporter<account_t, acct_handler_ptr,
|
||||
&report_t::accounts_report>
|
||||
(acct_handler_ptr(formatter), *this,
|
||||
string("#") + p));
|
||||
#endif
|
||||
|
||||
return expr_t::op_t::wrap_functor
|
||||
(reporter<account_t, acct_handler_ptr, &report_t::accounts_report>
|
||||
(new format_accounts(*this, report_format(HANDLER(budget_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t()),
|
||||
(acct_handler_ptr(new format_accounts
|
||||
(*this, report_format(HANDLER(budget_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t())),
|
||||
*this, "#budget"));
|
||||
}
|
||||
break;
|
||||
|
|
@ -1420,9 +1434,10 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
if (is_eq(p, "csv")) {
|
||||
return WRAP_FUNCTOR
|
||||
(reporter<>
|
||||
(new format_posts(*this, report_format(HANDLER(csv_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t()),
|
||||
(post_handler_ptr(new format_posts
|
||||
(*this, report_format(HANDLER(csv_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t())),
|
||||
*this, "#csv"));
|
||||
}
|
||||
else if (is_eq(p, "cleared")) {
|
||||
|
|
@ -1430,31 +1445,35 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
"(amount, cleared ? amount : 0)");
|
||||
return expr_t::op_t::wrap_functor
|
||||
(reporter<account_t, acct_handler_ptr, &report_t::accounts_report>
|
||||
(new format_accounts(*this, report_format(HANDLER(cleared_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t()),
|
||||
(acct_handler_ptr(new format_accounts
|
||||
(*this, report_format(HANDLER(cleared_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t())),
|
||||
*this, "#cleared"));
|
||||
}
|
||||
else if (is_eq(p, "convert")) {
|
||||
return WRAP_FUNCTOR(convert_command);
|
||||
}
|
||||
else if (is_eq(p, "commodities")) {
|
||||
return WRAP_FUNCTOR(reporter<>(new report_commodities(*this), *this,
|
||||
"#commodities"));
|
||||
return WRAP_FUNCTOR(reporter<>
|
||||
(post_handler_ptr(new report_commodities(*this)),
|
||||
*this, "#commodities"));
|
||||
}
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
if (is_eq(p, "equity")) {
|
||||
HANDLER(generated).on_only(string("#equity"));
|
||||
return WRAP_FUNCTOR(reporter<>(new print_xacts(*this), *this, "#equity"));
|
||||
return WRAP_FUNCTOR(reporter<>(post_handler_ptr(new print_xacts(*this)),
|
||||
*this, "#equity"));
|
||||
}
|
||||
else if (is_eq(p, "entry")) {
|
||||
return WRAP_FUNCTOR(xact_command);
|
||||
}
|
||||
else if (is_eq(p, "emacs")) {
|
||||
return WRAP_FUNCTOR
|
||||
(reporter<>(new format_emacs_posts(output_stream), *this, "#emacs"));
|
||||
(reporter<>(post_handler_ptr(new format_emacs_posts(output_stream)),
|
||||
*this, "#emacs"));
|
||||
}
|
||||
else if (is_eq(p, "echo")) {
|
||||
return MAKE_FUNCTOR(report_t::echo_command);
|
||||
|
|
@ -1465,7 +1484,8 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
if (is_eq(p, "org")) {
|
||||
return WRAP_FUNCTOR
|
||||
(reporter<>
|
||||
(new posts_to_org_table(*this, maybe_format(HANDLER(prepend_format_))),
|
||||
(post_handler_ptr(new posts_to_org_table
|
||||
(*this, maybe_format(HANDLER(prepend_format_)))),
|
||||
*this, "#org"));
|
||||
}
|
||||
break;
|
||||
|
|
@ -1473,30 +1493,33 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
case 'p':
|
||||
if (*(p + 1) == '\0' || is_eq(p, "print")) {
|
||||
return WRAP_FUNCTOR
|
||||
(reporter<>(new print_xacts(*this, HANDLED(raw)), *this, "#print"));
|
||||
(reporter<>(post_handler_ptr(new print_xacts(*this, HANDLED(raw))),
|
||||
*this, "#print"));
|
||||
}
|
||||
else if (is_eq(p, "prices")) {
|
||||
return expr_t::op_t::wrap_functor
|
||||
(reporter<post_t, post_handler_ptr, &report_t::commodities_report>
|
||||
(new format_posts(*this, report_format(HANDLER(prices_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t()),
|
||||
(post_handler_ptr(new format_posts
|
||||
(*this, report_format(HANDLER(prices_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t())),
|
||||
*this, "#prices"));
|
||||
}
|
||||
else if (is_eq(p, "pricedb")) {
|
||||
return expr_t::op_t::wrap_functor
|
||||
(reporter<post_t, post_handler_ptr, &report_t::commodities_report>
|
||||
(new format_posts(*this, report_format(HANDLER(pricedb_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t()),
|
||||
(post_handler_ptr(new format_posts
|
||||
(*this, report_format(HANDLER(pricedb_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t())),
|
||||
*this, "#pricedb"));
|
||||
}
|
||||
else if (is_eq(p, "pricemap")) {
|
||||
return MAKE_FUNCTOR(report_t::pricemap_command);
|
||||
}
|
||||
else if (is_eq(p, "payees")) {
|
||||
return WRAP_FUNCTOR(reporter<>(new report_payees(*this), *this,
|
||||
"#payees"));
|
||||
return WRAP_FUNCTOR(reporter<>(post_handler_ptr(new report_payees(*this)),
|
||||
*this, "#payees"));
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
@ -1504,9 +1527,10 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
if (*(p + 1) == '\0' || is_eq(p, "reg") || is_eq(p, "register")) {
|
||||
return WRAP_FUNCTOR
|
||||
(reporter<>
|
||||
(new format_posts(*this, report_format(HANDLER(register_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t()),
|
||||
(post_handler_ptr(new format_posts
|
||||
(*this, report_format(HANDLER(register_format_)),
|
||||
maybe_format(HANDLER(prepend_format_)),
|
||||
HANDLER(prepend_width_).value.to_size_t())),
|
||||
*this, "#register"));
|
||||
}
|
||||
else if (is_eq(p, "reload")) {
|
||||
|
|
@ -1525,7 +1549,8 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
if (is_eq(p, "xact"))
|
||||
return WRAP_FUNCTOR(xact_command);
|
||||
else if (is_eq(p, "xml"))
|
||||
return WRAP_FUNCTOR(reporter<>(new format_xml(*this), *this, "#xml"));
|
||||
return WRAP_FUNCTOR(reporter<>(post_handler_ptr(new format_xml(*this)),
|
||||
*this, "#xml"));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
|
@ -1550,7 +1575,7 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind,
|
|||
if (is_eq(p, "generate")) {
|
||||
return expr_t::op_t::wrap_functor
|
||||
(reporter<post_t, post_handler_ptr, &report_t::generate_report>
|
||||
(new print_xacts(*this), *this, "#generate"));
|
||||
(post_handler_ptr(new print_xacts(*this)), *this, "#generate"));
|
||||
}
|
||||
break;
|
||||
case 'p':
|
||||
|
|
|
|||
|
|
@ -1019,7 +1019,7 @@ class reporter
|
|||
string whence;
|
||||
|
||||
public:
|
||||
reporter(item_handler<Type> * _handler,
|
||||
reporter(shared_ptr<item_handler<Type> > _handler,
|
||||
report_t& _report, const string& _whence)
|
||||
: handler(_handler), report(_report), whence(_whence) {}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue