libctf: Sanitize error types for PR 30836

Made sure there is no implicit conversion between signed and unsigned
return value for functions setting the ctf_errno value.
An example of the problem is that in ctf_member_next, the "offset" value
is either 0L or (ctf_id_t)-1L, but it should have been 0L or -1L.
The issue was discovered while building a 64 bit ld binary to be
executed on the Windows platform.
Example object file that demonstrates the issue is attached in the PR.

libctf/
	Affected functions adjusted.

Signed-off-by: Torbjörn SVENSSON <torbjorn.svensson@foss.st.com>
Co-Authored-By: Yvan ROUX <yvan.roux@foss.st.com>
This commit is contained in:
Torbjörn SVENSSON
2023-09-13 11:02:36 +02:00
parent 22bfda88f8
commit 998a4f589d
8 changed files with 114 additions and 134 deletions

View File

@@ -90,6 +90,23 @@ ctf_assert_internal (ctf_dict_t *fp, const char *file, size_t line,
return expr;
}
static inline int
ctf_set_errno (ctf_dict_t *fp, int err)
{
fp->ctf_errno = err;
/* Don't rely on CTF_ERR here as it will not properly sign extend on 64-bit
Windows ABI. */
return -1;
}
static inline ctf_id_t
ctf_set_typed_errno (ctf_dict_t *fp, int err)
{
fp->ctf_errno = err;
return CTF_ERR;
}
#ifdef __cplusplus
}
#endif