libctf: make ctf_dump not crash on OOM
authorNick Alcock <nick.alcock@oracle.com>
Tue, 17 Sep 2019 05:57:00 +0000 (06:57 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Thu, 3 Oct 2019 16:04:56 +0000 (17:04 +0100)
commit9323dd869dfe481d46512c7f9b1a30d0b7d2d7c4
tree572351e13f69fc0b3cd6ce7292ffde488d302905
parentde07e349bea156484fae1dbec974fdbbf207d57d
libctf: make ctf_dump not crash on OOM

ctf_dump calls ctf_str_append extensively but never checks to see if it
returns NULL (on OOM).  If it ever does, we truncate the string we are
appending to and leak it!

Instead, create a variant of ctf_str_append that returns the *original
string* on OOM, and use it in ctf-dump.  It is far better to omit a tiny
piece of a dump on OOM than to omit a bigger piece, and it is also
better to do this in what is after all purely debugging code than it is
to uglify ctf-dump.c with huge numbers of checks for the out-of-memory
case.  Slightly truncated debugging output is better than no debugging
output at all and an out-of-memory message.

New in v4.

libctf/
* ctf-impl.h (ctf_str_append_noerr): Declare.
* ctf-util.c (ctf_str_append_noerr): Define in terms of
ctf_str_append.
* ctf-dump.c (str_append): New, call it.
(ctf_dump_format_type): Use str_append, not ctf_str_append.
(ctf_dump_label): Likewise.
(ctf_dump_objts): Likewise.
(ctf_dump_funcs): Likewise.
(ctf_dump_var): Likewise.
(ctf_dump_member): Likewise.
(ctf_dump_type): Likewise.
(ctf_dump): Likewise.
libctf/ChangeLog
libctf/ctf-dump.c
libctf/ctf-impl.h
libctf/ctf-util.c