mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
* sysdeps/generic/bp-checks.h (CHECK_SIGSET, CHECK_SIGSETopt):
New macros. * sysdeps/generic/strcpy.c: Add bounds checks. * sysdeps/unix/fxstat.c: Likewise. * sysdeps/unix/xstat.c: Likewise. * sysdeps/unix/common/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/aio_sigqueue.c: Likewise. * sysdeps/unix/sysv/linux/execve.c: Likewise. * sysdeps/unix/sysv/linux/fxstat.c: Likewise. * sysdeps/unix/sysv/linux/fxstat64.c: Likewise. * sysdeps/unix/sysv/linux/getcwd.c: Likewise. * sysdeps/unix/sysv/linux/getdents.c: Likewise. * sysdeps/unix/sysv/linux/llseek.c: Likewise. * sysdeps/unix/sysv/linux/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/lxstat64.c: Likewise. * sysdeps/unix/sysv/linux/poll.c: Likewise. * sysdeps/unix/sysv/linux/pread.c: Likewise. * sysdeps/unix/sysv/linux/pread64.c: Likewise. * sysdeps/unix/sysv/linux/ptrace.c: Likewise. * sysdeps/unix/sysv/linux/pwrite.c: Likewise. * sysdeps/unix/sysv/linux/pwrite64.c: Likewise. * sysdeps/unix/sysv/linux/readv.c: Likewise. * sysdeps/unix/sysv/linux/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/sigpending.c: Likewise. * sysdeps/unix/sysv/linux/sigprocmask.c: Likewise. * sysdeps/unix/sysv/linux/sigqueue.c: Likewise. * sysdeps/unix/sysv/linux/sigsuspend.c: Likewise. * sysdeps/unix/sysv/linux/sigtimedwait.c: Likewise. * sysdeps/unix/sysv/linux/sigwaitinfo.c: Likewise. * sysdeps/unix/sysv/linux/sysctl.c: Likewise. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/ustat.c: Likewise. * sysdeps/unix/sysv/linux/writev.c: Likewise. * sysdeps/unix/sysv/linux/xmknod.c: Likewise. * sysdeps/unix/sysv/linux/xstat.c: Likewise. * sysdeps/unix/sysv/linux/xstat64.c: Likewise. * sysdeps/unix/sysv/linux/arm/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/i386/brk.c: Likewise. * sysdeps/unix/sysv/linux/i386/chown.c: Likewise. * sysdeps/unix/sysv/linux/i386/fxstat.c: Likewise. * sysdeps/unix/sysv/linux/i386/getgroups.c: Likewise. * sysdeps/unix/sysv/linux/i386/getresgid.c: Likewise. * sysdeps/unix/sysv/linux/i386/getresuid.c: Likewise. * sysdeps/unix/sysv/linux/i386/getrlimit.c: Likewise. * sysdeps/unix/sysv/linux/i386/lchown.c: Likewise. * sysdeps/unix/sysv/linux/i386/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/i386/setgroups.c: Likewise. * sysdeps/unix/sysv/linux/i386/setrlimit.c: Likewise. * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/i386/xstat.c: Likewise. * sysdeps/unix/sysv/linux/ia64/fxstat.c: Likewise. * sysdeps/unix/sysv/linux/ia64/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigpending.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigprocmask.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigsuspend.c: Likewise. * sysdeps/unix/sysv/linux/ia64/xstat.c: Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c: Likewise. * sysdeps/unix/sysv/linux/mips/pread.c: Likewise. * sysdeps/unix/sysv/linux/mips/pread64.c: Likewise. * sysdeps/unix/sysv/linux/mips/pwrite.c: Likewise. * sysdeps/unix/sysv/linux/mips/pwrite64.c: Likewise. * sysdeps/unix/sysv/linux/mips/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/mips/ustat.c: Likewise. * sysdeps/unix/sysv/linux/mips/xmknod.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigpending.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigprocmask.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c: Likewise. * sysdeps/generic/bp-checks.h (CHECK_SIGSET, CHECK_SIGSETopt): New macros. * sysdeps/generic/strcpy.c: Add bounds checks. * sysdeps/unix/fxstat.c: Likewise. * sysdeps/unix/xstat.c: Likewise. * sysdeps/unix/common/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/aio_sigqueue.c: Likewise. * sysdeps/unix/sysv/linux/execve.c: Likewise. * sysdeps/unix/sysv/linux/fxstat.c: Likewise. * sysdeps/unix/sysv/linux/fxstat64.c: Likewise. * sysdeps/unix/sysv/linux/getcwd.c: Likewise. * sysdeps/unix/sysv/linux/getdents.c: Likewise. * sysdeps/unix/sysv/linux/llseek.c: Likewise. * sysdeps/unix/sysv/linux/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/lxstat64.c: Likewise. * sysdeps/unix/sysv/linux/poll.c: Likewise. * sysdeps/unix/sysv/linux/pread.c: Likewise. * sysdeps/unix/sysv/linux/pread64.c: Likewise. * sysdeps/unix/sysv/linux/ptrace.c: Likewise. * sysdeps/unix/sysv/linux/pwrite.c: Likewise. * sysdeps/unix/sysv/linux/pwrite64.c: Likewise. * sysdeps/unix/sysv/linux/readv.c: Likewise. * sysdeps/unix/sysv/linux/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/sigpending.c: Likewise. * sysdeps/unix/sysv/linux/sigprocmask.c: Likewise. * sysdeps/unix/sysv/linux/sigqueue.c: Likewise. * sysdeps/unix/sysv/linux/sigsuspend.c: Likewise. * sysdeps/unix/sysv/linux/sigtimedwait.c: Likewise. * sysdeps/unix/sysv/linux/sigwaitinfo.c: Likewise. * sysdeps/unix/sysv/linux/sysctl.c: Likewise. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/ustat.c: Likewise. * sysdeps/unix/sysv/linux/writev.c: Likewise. * sysdeps/unix/sysv/linux/xmknod.c: Likewise. * sysdeps/unix/sysv/linux/xstat.c: Likewise. * sysdeps/unix/sysv/linux/xstat64.c: Likewise. * sysdeps/unix/sysv/linux/arm/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/i386/brk.c: Likewise. * sysdeps/unix/sysv/linux/i386/chown.c: Likewise. * sysdeps/unix/sysv/linux/i386/fxstat.c: Likewise. * sysdeps/unix/sysv/linux/i386/getgroups.c: Likewise. * sysdeps/unix/sysv/linux/i386/getresgid.c: Likewise. * sysdeps/unix/sysv/linux/i386/getresuid.c: Likewise. * sysdeps/unix/sysv/linux/i386/getrlimit.c: Likewise. * sysdeps/unix/sysv/linux/i386/lchown.c: Likewise. * sysdeps/unix/sysv/linux/i386/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/i386/setgroups.c: Likewise. * sysdeps/unix/sysv/linux/i386/setrlimit.c: Likewise. * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/i386/xstat.c: Likewise. * sysdeps/unix/sysv/linux/ia64/fxstat.c: Likewise. * sysdeps/unix/sysv/linux/ia64/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigpending.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigprocmask.c: Likewise. * sysdeps/unix/sysv/linux/ia64/sigsuspend.c: Likewise. * sysdeps/unix/sysv/linux/ia64/xstat.c: Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c: Likewise. * sysdeps/unix/sysv/linux/mips/pread.c: Likewise. * sysdeps/unix/sysv/linux/mips/pread64.c: Likewise. * sysdeps/unix/sysv/linux/mips/pwrite.c: Likewise. * sysdeps/unix/sysv/linux/mips/pwrite64.c: Likewise. * sysdeps/unix/sysv/linux/mips/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/mips/ustat.c: Likewise. * sysdeps/unix/sysv/linux/mips/xmknod.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigpending.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigprocmask.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sigsuspend.c: Likewise.
This commit is contained in:
@ -19,19 +19,20 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#include <sys/mman.h>
|
||||
#include <bp-checks.h>
|
||||
|
||||
#include "kernel-features.h"
|
||||
|
||||
#ifdef __NR_mmap2
|
||||
extern __ptr_t __syscall_mmap2(__ptr_t, size_t, int, int, int, off_t);
|
||||
#ifndef __ASSUME_MMAP2_SYSCALL
|
||||
extern void *__unbounded __syscall_mmap2 (void *__unbounded, size_t,
|
||||
int, int, int, off_t);
|
||||
# ifndef __ASSUME_MMAP2_SYSCALL
|
||||
static int have_no_mmap2;
|
||||
#endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
__ptr_t
|
||||
@ -39,28 +40,32 @@ __mmap64 (__ptr_t addr, size_t len, int prot, int flags, int fd, off64_t offset)
|
||||
{
|
||||
#ifdef __NR_mmap2
|
||||
if (
|
||||
#ifndef __ASSUME_MMAP2_SYSCALL
|
||||
# ifndef __ASSUME_MMAP2_SYSCALL
|
||||
! have_no_mmap2 &&
|
||||
#endif
|
||||
# endif
|
||||
! (offset & 4095))
|
||||
{
|
||||
#ifndef __ASSUME_MMAP2_SYSCALL
|
||||
# ifndef __ASSUME_MMAP2_SYSCALL
|
||||
int saved_errno = errno;
|
||||
#endif
|
||||
# endif
|
||||
/* This will be always 12, no matter what page size is. */
|
||||
__ptr_t result =
|
||||
(__ptr_t) INLINE_SYSCALL (mmap2, 6, addr, len, prot, flags,
|
||||
fd, (off_t) (offset >> 12));
|
||||
|
||||
#ifndef __ASSUME_MMAP2_SYSCALL
|
||||
__ptr_t result;
|
||||
__ptrvalue (result) =
|
||||
(void *__unbounded) INLINE_SYSCALL (mmap2, 6, addr, len, prot, flags,
|
||||
fd, (off_t) (offset >> 12));
|
||||
# if __BOUNDED_POINTERS__
|
||||
__ptrlow (result) = __ptrvalue (result);
|
||||
__ptrhigh (result) = __ptrvalue (result) + len;
|
||||
# endif
|
||||
# ifndef __ASSUME_MMAP2_SYSCALL
|
||||
if (result != (__ptr_t) -1 || errno != ENOSYS)
|
||||
#endif
|
||||
# endif
|
||||
return result;
|
||||
|
||||
#ifndef __ASSUME_MMAP2_SYSCALL
|
||||
# ifndef __ASSUME_MMAP2_SYSCALL
|
||||
__set_errno (saved_errno);
|
||||
have_no_mmap2 = 1;
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
if (offset != (off_t) offset || (offset + len) != (off_t) (offset + len))
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <sysdep.h>
|
||||
#include <sys/signal.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <kernel_sigaction.h>
|
||||
|
||||
/* SPARC 64bit userland requires a kernel that has rt signals anyway. */
|
||||
@ -48,8 +49,9 @@ __libc_sigaction (int sig, __const struct sigaction *act,
|
||||
|
||||
/* XXX The size argument hopefully will have to be changed to the
|
||||
real size of the user-level sigset_t. */
|
||||
ret = INLINE_SYSCALL (rt_sigaction, 5, sig, act ? &kact : 0,
|
||||
oact ? &koact : 0, stub, _NSIG / 8);
|
||||
ret = INLINE_SYSCALL (rt_sigaction, 5, sig,
|
||||
act ? __ptrvalue (&kact) : 0,
|
||||
oact ? __ptrvalue (&koact) : 0, stub, _NSIG / 8);
|
||||
|
||||
if (oact && ret >= 0)
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997, 1998, 1999, 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
|
||||
@ -22,8 +22,9 @@
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <bp-checks.h>
|
||||
|
||||
extern int __syscall_rt_sigpending (sigset_t *, size_t);
|
||||
extern int __syscall_rt_sigpending (sigset_t *__unbounded, size_t);
|
||||
|
||||
|
||||
/* Change the set of blocked signals to SET,
|
||||
@ -34,5 +35,5 @@ sigpending (set)
|
||||
{
|
||||
/* XXX The size argument hopefully will have to be changed to the
|
||||
real size of the user-level sigset_t. */
|
||||
return INLINE_SYSCALL (rt_sigpending, 2, set, _NSIG / 8);
|
||||
return INLINE_SYSCALL (rt_sigpending, 2, CHECK_SIGSET (set), _NSIG / 8);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1997, 1998, 1999, 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
|
||||
@ -22,9 +22,10 @@
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <bp-checks.h>
|
||||
|
||||
extern int __syscall_rt_sigprocmask (int, const sigset_t *, sigset_t *,
|
||||
size_t);
|
||||
extern int __syscall_rt_sigprocmask (int, const sigset_t *__unbounded,
|
||||
sigset_t *__unbounded, size_t);
|
||||
|
||||
/* Get and/or change the set of blocked signals. */
|
||||
int
|
||||
@ -35,6 +36,7 @@ __sigprocmask (how, set, oset)
|
||||
{
|
||||
/* XXX The size argument hopefully will have to be changed to the
|
||||
real size of the user-level sigset_t. */
|
||||
return INLINE_SYSCALL (rt_sigprocmask, 4, how, set, oset, _NSIG / 8);
|
||||
return INLINE_SYSCALL (rt_sigprocmask, 4, how, CHECK_SIGSET (set),
|
||||
CHECK_SIGSETopt (oset), _NSIG / 8);
|
||||
}
|
||||
weak_alias (__sigprocmask, sigprocmask)
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1996, 1997, 1998, 1999, 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
|
||||
@ -22,8 +22,9 @@
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <bp-checks.h>
|
||||
|
||||
extern int __syscall_rt_sigsuspend (const sigset_t *, size_t);
|
||||
extern int __syscall_rt_sigsuspend (const sigset_t *__unbounded, size_t);
|
||||
|
||||
/* Change the set of blocked signals to SET,
|
||||
wait until a signal arrives, and restore the set of blocked signals. */
|
||||
@ -33,6 +34,6 @@ __sigsuspend (set)
|
||||
{
|
||||
/* XXX The size argument hopefully will have to be changed to the
|
||||
real size of the user-level sigset_t. */
|
||||
return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8);
|
||||
return INLINE_SYSCALL (rt_sigsuspend, 2, CHECK_SIGSET (set), _NSIG / 8);
|
||||
}
|
||||
weak_alias (__sigsuspend, sigsuspend)
|
||||
|
Reference in New Issue
Block a user