1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-12-24 17:51:17 +03:00

mach, hurd: Cast through uintptr_t

When casting between a pointer and an integer of a different size, GCC
emits a warning (which is escalated to a build failure by -Werror).
Indeed, if what you start with is a pointer, which you then cast to a
shorter integer and then back again, you're going to cut off some bits
of the pointer.

But if you start with an integer (such as mach_port_t), then cast it to
a longer pointer (void *), and then back to a shorter integer, you are
fine. To keep GCC happy, cast through an intermediary uintptr_t, which
is always the same size as a pointer.

Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
Message-Id: <20230212111044.610942-4-bugaevc@gmail.com>
This commit is contained in:
Sergey Bugaev
2023-02-12 14:10:34 +03:00
committed by Samuel Thibault
parent f4315054b4
commit 62d6c33030
6 changed files with 25 additions and 15 deletions

View File

@@ -28,7 +28,7 @@
static ssize_t
devstream_write (void *cookie, const char *buffer, size_t n)
{
const device_t dev = (device_t) cookie;
const device_t dev = (device_t) (uintptr_t) cookie;
int write_some (const char *p, size_t to_write)
{
@@ -83,7 +83,7 @@ devstream_write (void *cookie, const char *buffer, size_t n)
static ssize_t
devstream_read (void *cookie, char *buffer, size_t to_read)
{
const device_t dev = (device_t) cookie;
const device_t dev = (device_t) (uintptr_t) cookie;
kern_return_t err;
mach_msg_type_number_t nread = to_read;
@@ -112,7 +112,8 @@ devstream_read (void *cookie, char *buffer, size_t to_read)
static int
dealloc_ref (void *cookie)
{
if (__mach_port_deallocate (mach_task_self (), (mach_port_t) cookie))
const device_t dev = (device_t) (uintptr_t) cookie;
if (__mach_port_deallocate (mach_task_self (), dev))
{
errno = EINVAL;
return -1;
@@ -131,7 +132,7 @@ mach_open_devstream (mach_port_t dev, const char *mode)
return NULL;
}
stream = _IO_fopencookie ((void *) dev, mode,
stream = _IO_fopencookie ((void *) (uintptr_t) dev, mode,
(cookie_io_functions_t) { write: devstream_write,
read: devstream_read,
close: dealloc_ref });