aboutsummaryrefslogtreecommitdiff
path: root/libctf
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2020-11-20 13:34:04 +0000
committerNick Alcock <nick.alcock@oracle.com>2020-11-20 13:34:12 +0000
commit8f235c90a287ee961153dd94f5ca28b033ebb668 (patch)
treed43c3ab0cf3fae2b62081fa92e1c3f534efdf205 /libctf
parent97a2a623d0193dbfc92d92545b63aaffd6099272 (diff)
downloadfsf-binutils-gdb-8f235c90a287ee961153dd94f5ca28b033ebb668.zip
fsf-binutils-gdb-8f235c90a287ee961153dd94f5ca28b033ebb668.tar.gz
fsf-binutils-gdb-8f235c90a287ee961153dd94f5ca28b033ebb668.tar.bz2
libctf: error-handling fixes
libctf/ChangeLog 2020-11-20 Nick Alcock <nick.alcock@oracle.com> * ctf-create.c (ctf_dtd_insert): Set ENOMEM on the dict if out of memory. (ctf_dvd_insert): Likewise. (ctf_add_function): Report ECTF_RDONLY if this dict is not writable. * ctf-subr.c (ctf_err_warn): Only debug-dump passed-in warnings if the passed-in error code is nonzero: the error on the dict for warnings may relate to a previous error.
Diffstat (limited to 'libctf')
-rw-r--r--libctf/ChangeLog9
-rw-r--r--libctf/ctf-create.c14
-rw-r--r--libctf/ctf-subr.c6
3 files changed, 25 insertions, 4 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 685c06a..0a8da12 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,14 @@
2020-11-20 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-create.c (ctf_dtd_insert): Set ENOMEM on the dict if out of memory.
+ (ctf_dvd_insert): Likewise.
+ (ctf_add_function): Report ECTF_RDONLY if this dict is not writable.
+ * ctf-subr.c (ctf_err_warn): Only debug-dump passed-in warnings if
+ the passed-in error code is nonzero: the error on the dict for
+ warnings may relate to a previous error.
+
+2020-11-20 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-open.c (ctf_getsymsect): New.
(ctf_getstrsect): Likewise.
* libctf.ver: Add them.
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c
index 5fc50a5..c3223a7 100644
--- a/libctf/ctf-create.c
+++ b/libctf/ctf-create.c
@@ -1257,7 +1257,10 @@ ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
const char *name;
if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
dtd) < 0)
- return -1;
+ {
+ ctf_set_errno (fp, ENOMEM);
+ return -1;
+ }
if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
&& (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
@@ -1268,6 +1271,7 @@ ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
{
ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t)
dtd->dtd_type);
+ ctf_set_errno (fp, ENOMEM);
return -1;
}
}
@@ -1349,7 +1353,10 @@ int
ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
{
if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
- return -1;
+ {
+ ctf_set_errno (fp, ENOMEM);
+ return -1;
+ }
ctf_list_append (&fp->ctf_dvdefs, dvd);
return 0;
}
@@ -1721,6 +1728,9 @@ ctf_add_function (ctf_dict_t *fp, uint32_t flag,
ctf_dict_t *tmp = fp;
size_t i;
+ if (!(fp->ctf_flags & LCTF_RDWR))
+ return (ctf_set_errno (fp, ECTF_RDONLY));
+
if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
|| (ctc->ctc_argc != 0 && argv == NULL))
return (ctf_set_errno (fp, EINVAL));
diff --git a/libctf/ctf-subr.c b/libctf/ctf-subr.c
index c902494..a4d445a 100644
--- a/libctf/ctf-subr.c
+++ b/libctf/ctf-subr.c
@@ -225,10 +225,12 @@ ctf_err_warn (ctf_dict_t *fp, int is_warning, int err,
}
va_end (alist);
- /* Include the error code only if there is one, and if this is not a warning.
+ /* Include the error code only if there is one; if this is not a warning,
+ only use the error code if it was explicitly passed and is nonzero.
(Warnings may not have a meaningful error code, since the warning may not
lead to unwinding up to the user.) */
- if (!is_warning && (err != 0 || (fp && ctf_errno (fp) != 0)))
+ if ((!is_warning && (err != 0 || (fp && ctf_errno (fp) != 0)))
+ || (is_warning && err != 0))
ctf_dprintf ("%s: %s (%s)\n", is_warning ? _("error") : _("warning"),
cew->cew_text, err != 0 ? ctf_errmsg (err)
: ctf_errmsg (ctf_errno (fp)));