diff options
author | Nick Alcock <nick.alcock@oracle.com> | 2019-06-19 12:14:16 +0100 |
---|---|---|
committer | Nick Alcock <nick.alcock@oracle.com> | 2019-06-21 13:04:01 +0100 |
commit | 24865428034f44d9fffe6b2d9a318e1bd507c63a (patch) | |
tree | d86d3a456e6ac6988c54cbb1f05e2fff0925ba52 /libctf/ctf-create.c | |
parent | PR24689, string table corruption (diff) | |
download | binutils-gdb-24865428034f44d9fffe6b2d9a318e1bd507c63a.tar.gz binutils-gdb-24865428034f44d9fffe6b2d9a318e1bd507c63a.tar.bz2 binutils-gdb-24865428034f44d9fffe6b2d9a318e1bd507c63a.zip |
libctf: handle errors on dynhash insertion better
We were missing several cases where dynhash insertion might fail, likely
due to OOM but possibly for other reasons. Pass the errors on.
libctf/
* ctf-create.c (ctf_dtd_insert): Pass on error returns from
ctf_dynhash_insert.
(ctf_dvd_insert): Likewise.
(ctf_add_generic): Likewise.
(ctf_add_variable): Likewise.
* ctf-impl.h: Adjust declarations.
Diffstat (limited to 'libctf/ctf-create.c')
-rw-r--r-- | libctf/ctf-create.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c index 5bcc36eff81..5b53479294c 100644 --- a/libctf/ctf-create.c +++ b/libctf/ctf-create.c @@ -526,18 +526,22 @@ ctf_prefixed_name (int kind, const char *name) return prefixed; } -void +int ctf_dtd_insert (ctf_file_t *fp, ctf_dtdef_t *dtd) { - ctf_dynhash_insert (fp->ctf_dthash, (void *) dtd->dtd_type, dtd); - ctf_list_append (&fp->ctf_dtdefs, dtd); + if (ctf_dynhash_insert (fp->ctf_dthash, (void *) dtd->dtd_type, dtd) < 0) + return -1; + if (dtd->dtd_name) { int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info); - ctf_dynhash_insert (fp->ctf_dtbyname, ctf_prefixed_name (kind, - dtd->dtd_name), - dtd); + if (ctf_dynhash_insert (fp->ctf_dtbyname, + ctf_prefixed_name (kind, dtd->dtd_name), + dtd) < 0) + return -1; } + ctf_list_append (&fp->ctf_dtdefs, dtd); + return 0; } void @@ -623,11 +627,13 @@ ctf_dynamic_type (const ctf_file_t *fp, ctf_id_t id) return NULL; } -void +int ctf_dvd_insert (ctf_file_t *fp, ctf_dvdef_t *dvd) { - ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd); + if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0) + return -1; ctf_list_append (&fp->ctf_dvdefs, dvd); + return 0; } void @@ -762,7 +768,11 @@ ctf_add_generic (ctf_file_t *fp, uint32_t flag, const char *name, if (s != NULL) fp->ctf_dtvstrlen += strlen (s) + 1; - ctf_dtd_insert (fp, dtd); + if (ctf_dtd_insert (fp, dtd) < 0) + { + ctf_free (dtd); + return CTF_ERR; /* errno is set for us. */ + } fp->ctf_flags |= LCTF_DIRTY; *rp = dtd; @@ -1442,7 +1452,11 @@ ctf_add_variable (ctf_file_t *fp, const char *name, ctf_id_t ref) dvd->dvd_type = ref; dvd->dvd_snapshots = fp->ctf_snapshots; - ctf_dvd_insert (fp, dvd); + if (ctf_dvd_insert (fp, dvd) < 0) + { + ctf_free (dvd); + return -1; /* errno is set for us. */ + } fp->ctf_dtvstrlen += strlen (name) + 1; fp->ctf_flags |= LCTF_DIRTY; |