From 998a4f589d68503f79695f180fdf1742eeb0a39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20SVENSSON?= Date: Wed, 13 Sep 2023 11:02:36 +0200 Subject: libctf: Sanitize error types for PR 30836 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Co-Authored-By: Yvan ROUX --- libctf/ctf-inlines.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'libctf/ctf-inlines.h') diff --git a/libctf/ctf-inlines.h b/libctf/ctf-inlines.h index 6bda68d..84044a1 100644 --- a/libctf/ctf-inlines.h +++ b/libctf/ctf-inlines.h @@ -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 -- cgit v1.1