[05/11] libctf: don't leak enums if ctf_add_type fails

Message ID 20240613185430.85352-6-nick.alcock@oracle.com
State New
Headers
Series enumerator query API, plus some bugfixes |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Test passed

Commit Message

Nick Alcock June 13, 2024, 6:54 p.m. UTC
  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(-)
  

Patch

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;