mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 19:53:32 +08:00
2000-12-06 Roland McGrath <roland@frob.com>
* sysdeps/mach/hurd/ioctl.c (__ioctl): Don't clobber ARG as we copy in argument data, since it will be used to copy out too (for INOUT). Reported by Marcus Brinkmann <marcus@gnu.org>. * sysdeps/mach/hurd/ioctl.c: Include <stdint.h>. (__ioctl): Use uintptr_t instead of unsigned long int.
This commit is contained in:
parent
9cf90923ca
commit
cde4d97bf2
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1992, 93, 94, 95, 96, 97, 99 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1992,93,94,95,96,97,99,2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -25,6 +25,7 @@
|
||||
#include <mach/notify.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <hurd/ioctl.h>
|
||||
#include <mach/mig_support.h>
|
||||
|
||||
@ -82,6 +83,10 @@ __ioctl (int fd, unsigned long int request, ...)
|
||||
|
||||
if (_IOC_INOUT (request) & IOC_IN)
|
||||
{
|
||||
/* We don't want to advance ARG since it will be used to copy out
|
||||
too if IOC_OUT is also set. */
|
||||
void *argptr = arg;
|
||||
|
||||
/* Pack an argument into the message buffer. */
|
||||
void in (unsigned int count, enum __ioctl_datum type)
|
||||
{
|
||||
@ -90,10 +95,10 @@ __ioctl (int fd, unsigned long int request, ...)
|
||||
void *p = &t[1];
|
||||
const size_t len = count * typesize ((unsigned int) type);
|
||||
*t = io2mach_type (count, type);
|
||||
memcpy (p, arg, len);
|
||||
arg += len;
|
||||
p = __mempcpy (p, argptr, len);
|
||||
argptr += len;
|
||||
p += len;
|
||||
p = (void *) (((unsigned long int) p + sizeof (*t) - 1)
|
||||
p = (void *) (((uintptr_t) p + sizeof (*t) - 1)
|
||||
& ~(sizeof (*t) - 1));
|
||||
t = p;
|
||||
}
|
||||
@ -232,7 +237,7 @@ __ioctl (int fd, unsigned long int request, ...)
|
||||
memcpy (store, t, len);
|
||||
if (update != NULL)
|
||||
*update += len;
|
||||
t = (void *) (((unsigned long int) t + len + sizeof (*t) - 1)
|
||||
t = (void *) (((uintptr_t) t + len + sizeof (*t) - 1)
|
||||
& ~(sizeof (*t) - 1));
|
||||
}
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user