Description
Hi all,
First, thanks for creating the tinyformat library. Having an easy-to-use locale independent formatting library available under a permissive license is really nice! :)
Bitcoin Core uses tinyformat for formatting of log messages. While auditing Bitcoin Core I discovered the following issues in tinyformat that I thought were worth reporting upstreams.
All issues have been verified against current master.
Issue 1. The following causes a signed integer overflow and a subsequent allocation of 9 GB of RAM (or an OOM in memory constrained environments):
tfm::format("%.777777700000000$", 1.0);
Issue 2. The following causes a stack overflow:
tfm::format("%987654321000000:", 1);
Issue 3. The following causes a stack overflow:
tfm::format("%1$*1$*", -11111111);
Issue 4. The following causes a NULL
pointer dereference:
tfm::format("%.1s", (char *)nullptr);
Issue 5. The following causes a float cast overflow:
tfm::format("%c", -1000.0);
Issue 6. The following causes a float cast overflow followed by an invalid integer negation:
tfm::format("%*", std::numeric_limits<double>::lowest());
Note that I've only audited tfm::format(…, …)
which is the part of tinyformat used by Bitcoin Core.
Thanks for a nice library!