Author: florian
Date: Tue May 12 22:19:25 2015
New Revision: 15219
Log:
Fix bug in do_mremap. Also need to allow SkShmC segments.
Added:
trunk/none/tests/linux/mremap4.c
trunk/none/tests/linux/mremap4.stderr.exp
trunk/none/tests/linux/mremap4.vgtest
Modified:
trunk/NEWS
trunk/coregrind/m_syswrap/syswrap-generic.c
trunk/none/tests/linux/ (props changed)
trunk/none/tests/linux/Makefile.am
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Tue May 12 22:19:25 2015
@@ -182,6 +182,7 @@
n-i-bz Fix compilation on distros with glibc < 2.5
n-i-bz (vex 3098) Avoid generation of Neon insns on non-Neon hosts
n-i-bz Enable rt_sigpending syscall on ppc64 linux.
+n-i-bz mremap did not work properly on shared memory
Release 3.10.1 (25 November 2014)
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-generic.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c Tue May 12 22:19:25 2015
@@ -328,7 +328,8 @@
old_seg = VG_(am_find_nsegment)( old_addr );
if (old_addr < old_seg->start || old_addr+old_len-1 > old_seg->end)
goto eINVAL;
- if (old_seg->kind != SkAnonC && old_seg->kind != SkFileC)
+ if (old_seg->kind != SkAnonC && old_seg->kind != SkFileC &&
+ old_seg->kind != SkShmC)
goto eINVAL;
vg_assert(old_len > 0);
Modified: trunk/none/tests/linux/Makefile.am
==============================================================================
--- trunk/none/tests/linux/Makefile.am (original)
+++ trunk/none/tests/linux/Makefile.am Tue May 12 22:19:25 2015
@@ -11,6 +11,7 @@
mremap.vgtest \
mremap2.stderr.exp mremap2.stdout.exp mremap2.vgtest \
mremap3.stderr.exp mremap3.stdout.exp mremap3.vgtest \
+ mremap4.stderr.exp mremap4.vgtest \
pthread-stack.stderr.exp pthread-stack.vgtest \
stack-overflow.stderr.exp stack-overflow.vgtest
@@ -21,6 +22,7 @@
mremap \
mremap2 \
mremap3 \
+ mremap4 \
pthread-stack \
stack-overflow
Added: trunk/none/tests/linux/mremap4.c
==============================================================================
--- trunk/none/tests/linux/mremap4.c (added)
+++ trunk/none/tests/linux/mremap4.c Tue May 12 22:19:25 2015
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/stat.h>
+
+
+extern void *mremap(void *, size_t, size_t, int, ...);
+
+int main()
+{
+ int shmid = shmget(IPC_PRIVATE, 100 * 4096,
+ IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
+ assert(shmid != -1);
+
+ void *addr = shmat(shmid, NULL, 0);
+ assert(addr != (void *)-1);
+
+ addr = mremap(addr, 100 * 4096, 40 * 4096, 0);
+ assert(addr != (void *)-1);
+
+ return 0;
+}
Added: trunk/none/tests/linux/mremap4.stderr.exp
==============================================================================
(empty)
Added: trunk/none/tests/linux/mremap4.vgtest
==============================================================================
--- trunk/none/tests/linux/mremap4.vgtest (added)
+++ trunk/none/tests/linux/mremap4.vgtest Tue May 12 22:19:25 2015
@@ -0,0 +1,2 @@
+prog: mremap4
+vgopts: -q
|