From 327356780ab4436b59b666a756323b8bda68cbd4 Mon Sep 17 00:00:00 2001 From: Nick Alcock Date: Tue, 11 Jun 2024 20:11:29 +0100 Subject: libctf: don't leak enums if ctf_add_type fails If ctf_add_type failed in the middle of enumerator addition, the destination would end up containing the source enum type and some but not all of its enumerator constants. Use snapshots to roll back the enum addition as a whole if this happens. Before now, it's been pretty unlikely, but in an upcoming commit we will ban addition of enumerators that already exist in a given dict, making failure of ctf_add_enumerator and thus of this part of ctf_add_type much more likely. libctf/ * ctf-create.c (ctf_add_type_internal): Roll back if enum or enumerator addition fails. --- libctf/ctf-create.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'libctf') diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c index ee79e49..073006b 100644 --- a/libctf/ctf-create.c +++ b/libctf/ctf-create.c @@ -1944,10 +1944,15 @@ ctf_add_type_internal (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type } else { + ctf_snapshot_id_t snap = ctf_snapshot (dst_fp); + dst_type = ctf_add_enum (dst_fp, flag, name); if ((dst.ctb_type = dst_type) == CTF_ERR || ctf_enum_iter (src_fp, src_type, enumadd, &dst)) - return CTF_ERR; /* errno is set for us */ + { + ctf_rollback (dst_fp, snap); + return CTF_ERR; /* errno is set for us */ + } } break; -- cgit v1.1