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.
This commit is contained in:
parent
97a2a623d0
commit
8f235c90a2
3 changed files with 25 additions and 4 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
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>
|
2020-11-20 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
* ctf-open.c (ctf_getsymsect): New.
|
* ctf-open.c (ctf_getsymsect): New.
|
||||||
|
|
|
@ -1257,7 +1257,10 @@ ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
|
||||||
const char *name;
|
const char *name;
|
||||||
if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
|
if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
|
||||||
dtd) < 0)
|
dtd) < 0)
|
||||||
return -1;
|
{
|
||||||
|
ctf_set_errno (fp, ENOMEM);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
|
if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
|
||||||
&& (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
|
&& (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)
|
ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t)
|
||||||
dtd->dtd_type);
|
dtd->dtd_type);
|
||||||
|
ctf_set_errno (fp, ENOMEM);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1349,7 +1353,10 @@ int
|
||||||
ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
|
ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
|
||||||
{
|
{
|
||||||
if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
|
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);
|
ctf_list_append (&fp->ctf_dvdefs, dvd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1721,6 +1728,9 @@ ctf_add_function (ctf_dict_t *fp, uint32_t flag,
|
||||||
ctf_dict_t *tmp = fp;
|
ctf_dict_t *tmp = fp;
|
||||||
size_t i;
|
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
|
if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
|
||||||
|| (ctc->ctc_argc != 0 && argv == NULL))
|
|| (ctc->ctc_argc != 0 && argv == NULL))
|
||||||
return (ctf_set_errno (fp, EINVAL));
|
return (ctf_set_errno (fp, EINVAL));
|
||||||
|
|
|
@ -225,10 +225,12 @@ ctf_err_warn (ctf_dict_t *fp, int is_warning, int err,
|
||||||
}
|
}
|
||||||
va_end (alist);
|
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
|
(Warnings may not have a meaningful error code, since the warning may not
|
||||||
lead to unwinding up to the user.) */
|
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"),
|
ctf_dprintf ("%s: %s (%s)\n", is_warning ? _("error") : _("warning"),
|
||||||
cew->cew_text, err != 0 ? ctf_errmsg (err)
|
cew->cew_text, err != 0 ? ctf_errmsg (err)
|
||||||
: ctf_errmsg (ctf_errno (fp)));
|
: ctf_errmsg (ctf_errno (fp)));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue