summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/shmat.c
diff options
context:
space:
mode:
authorGreg McGary <greg@mcgary.org>2000-07-27 06:25:28 +0000
committerGreg McGary <greg@mcgary.org>2000-07-27 06:25:28 +0000
commitd25c879dc55dcc6a477fdce1c75382afec7596b8 (patch)
tree623e432d69fb742e511a258889ca3f4bfaf113e0 /sysdeps/unix/sysv/linux/shmat.c
parent4362aba591b7f7dd67abdb37478a4dd8393b5253 (diff)
downloadglibc-d25c879dc55dcc6a477fdce1c75382afec7596b8.tar.gz
* sysdeps/gnu/bits/msq.h: Qualify kernel's
data structure pointers as __unbounded. * sysdeps/unix/sysv/linux/mips/bits/shm.h: Likewise. * sysdeps/generic/bp-semctl.h: New file. * sysdeps/unix/sysv/linux/msgctl.c: Qualify kernel's data structure pointers as __unbounded. Check bounds of syscall args. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/alpha/msgctl.c: Likewise. * sysdeps/unix/sysv/linux/alpha/semctl.c: Likewise. * sysdeps/unix/sysv/linux/alpha/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/i386/msgctl.c: Likewise. * sysdeps/unix/sysv/linux/i386/semctl.c: Likewise. * sysdeps/unix/sysv/linux/i386/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: Likewise. 2000-07-26 Greg McGary <greg@mcgary.org> * sysdeps/gnu/bits/msq.h: Qualify kernel's data structure pointers as __unbounded. * sysdeps/unix/sysv/linux/mips/bits/shm.h: Likewise. * sysdeps/generic/bp-semctl.h: New file. * sysdeps/unix/sysv/linux/msgctl.c: Qualify kernel's data structure pointers as __unbounded. Check bounds of syscall args. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/alpha/msgctl.c: Likewise. * sysdeps/unix/sysv/linux/alpha/semctl.c: Likewise. * sysdeps/unix/sysv/linux/alpha/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/i386/msgctl.c: Likewise. * sysdeps/unix/sysv/linux/i386/semctl.c: Likewise. * sysdeps/unix/sysv/linux/i386/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/shmat.c')
-rw-r--r--sysdeps/unix/sysv/linux/shmat.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/sysdeps/unix/sysv/linux/shmat.c b/sysdeps/unix/sysv/linux/shmat.c
index e2035c9d51..33dc016b14 100644
--- a/sysdeps/unix/sysv/linux/shmat.c
+++ b/sysdeps/unix/sysv/linux/shmat.c
@@ -23,6 +23,7 @@
#include <sysdep.h>
#include <sys/syscall.h>
+#include <bp-checks.h>
/* Attach the shared memory segment associated with SHMID to the data
segment of the calling process. SHMADDR and SHMFLG determine how
@@ -34,11 +35,23 @@ shmat (shmid, shmaddr, shmflg)
const void *shmaddr;
int shmflg;
{
- long int retval;
- unsigned long raddr;
-
- retval = INLINE_SYSCALL (ipc, 5, IPCOP_shmat, shmid, shmflg,
- (long int) &raddr, (void *) shmaddr);
- return ((unsigned long int) retval > -(unsigned long int) SHMLBA
- ? (void *) retval : (void *) raddr);
+ void *__unbounded result;
+ void *__unbounded raddr;
+
+#if __BOUNDED_POINTERS__
+ size_t length = ~0;
+ struct shmid_ds shmds;
+ /* It's unfortunate that we need to make another system call to get
+ the shared memory segment length... */
+ if (shmctl (shmid, ICP_STAT, &shmds) == 0)
+ length = shmds.shm_segsz;
+#endif
+
+ result = (void *__unbounded) INLINE_SYSCALL (ipc, 5, IPCOP_shmat, shmid, shmflg,
+ __ptrvalue (&raddr),
+ __ptrvalue (shmaddr));
+ if ((unsigned long) result <= -(unsigned long) SHMLBA)
+ result = raddr;
+
+ return BOUNDED_N (result, length);
}