[binutils-gdb] libctf: don't leak enums if ctf_add_type fails

Nick Alcock nix@sourceware.org
Tue Jun 18 12:55:31 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=327356780ab4436b59b666a756323b8bda68cbd4

commit 327356780ab4436b59b666a756323b8bda68cbd4
Author: Nick Alcock <nick.alcock@oracle.com>
Date:   Tue Jun 11 20:11:29 2024 +0100

    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.

Diff:
---
 libctf/ctf-create.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c
index ee79e49794d..073006b24ea 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;


More information about the Binutils-cvs mailing list