|
From: Jeremy F. <je...@go...> - 2005-02-25 05:31:53
|
CVS commit by fitzhardinge:
Take note of mmaps from devices, and avoid touching them casually.
Scanning one in the leak checker or trying to core-dump one could lock
up the machine.
M +2 -1 coregrind/core.h 1.91
M +13 -4 coregrind/vg_memory.c 1.92
M +2 -2 coregrind/vg_signals.c 1.131
M +1 -1 coregrind/vg_syscalls.c 1.254
M +20 -0 include/x86-linux/vki_arch.h 1.13
--- valgrind/coregrind/vg_syscalls.c #1.253:1.254
@@ -4188,5 +4188,5 @@ POST(sys_ioctl)
/* ioctls may spontaneously create memory mappings, so go
search for them */
- VG_(sync_segments)();
+ VG_(sync_segments)(SF_DEVICE | SF_MMAP);
}
break;
--- valgrind/coregrind/vg_memory.c #1.91:1.92
@@ -465,4 +465,8 @@ void VG_(map_fd_segment)(Addr addr, Size
if (VG_(fstat)(fd, &st) < 0)
flags &= ~SF_FILE;
+ else {
+ if (VKI_S_ISCHR(st.st_mode) || VKI_S_ISBLK(st.st_mode))
+ flags |= SF_DEVICE;
+ }
}
@@ -841,5 +845,5 @@ void VG_(find_root_memory)(void (*add_ro
for(s = VG_(first_segment)(); s != NULL; s = VG_(next_segment)(s)) {
- UInt flags = s->flags & (SF_SHARED|SF_MMAP|SF_VALGRIND|SF_CORE|SF_STACK);
+ UInt flags = s->flags & (SF_SHARED|SF_MMAP|SF_VALGRIND|SF_CORE|SF_STACK|SF_DEVICE);
if (flags != SF_MMAP && flags != SF_STACK)
continue;
@@ -978,4 +982,5 @@ void VG_(print_shadow_stats)()
static Segment *next_segment;
+static UInt sync_maps_flags;
static void sync_maps(Addr addr, SizeT len, UInt prot,
@@ -986,5 +991,7 @@ static void sync_maps(Addr addr, SizeT l
Addr end = addr+len;
Segment *seg, *first, *last;
- UInt flags = (addr < VG_(client_end)) ? 0 : SF_VALGRIND;
+ UInt flags = sync_maps_flags;
+
+ flags |= (addr < VG_(client_end)) ? 0 : SF_VALGRIND;
seg = next_segment;
@@ -1012,5 +1019,5 @@ static void sync_maps(Addr addr, SizeT l
if (debug)
VG_(printf)("SYNC: inserting %p-%p %s\n", addr, end, VG_(prot_str)(prot));
- VG_(map_file_segment)(addr, len, prot, flags | SF_MMAP, dev, ino, foff, filename);
+ VG_(map_file_segment)(addr, len, prot, flags, dev, ino, foff, filename);
VG_TRACK ( new_mem_mmap, addr, len,
@@ -1042,5 +1049,5 @@ static void sync_maps(Addr addr, SizeT l
}
-void VG_(sync_segments)(void)
+void VG_(sync_segments)(UInt flags)
{
static const Bool debug = 0;
@@ -1049,4 +1056,6 @@ void VG_(sync_segments)(void)
next_segment = VG_(first_segment)();
+ sync_maps_flags = flags;
+
VG_(parse_procselfmaps)(sync_maps);
--- valgrind/coregrind/core.h #1.90:1.91
@@ -1201,4 +1201,5 @@ extern void VG_(print_scheduler_stats) (
#define SF_VALGRIND (1 << 13) // a valgrind-internal mapping - not in client
#define SF_CODE (1 << 14) // segment contains cached code
+#define SF_DEVICE (1 << 15) // device mapping; avoid careless touching
struct _Segment {
@@ -1258,5 +1259,5 @@ extern REGPARM(1)
/* Search /proc/self/maps for changes which aren't reflected in the
segment list */
-extern void VG_(sync_segments)();
+extern void VG_(sync_segments)(UInt flags);
/* Check vg_memory structures for sanity */
--- valgrind/coregrind/vg_signals.c #1.130:1.131
@@ -911,5 +911,5 @@ void VG_(kill_self)(Int sigNo)
static Bool may_dump(const Segment *seg)
{
- return (seg->flags & SF_VALGRIND) == 0 && VG_(is_client_addr)(seg->addr);
+ return (seg->flags & (SF_DEVICE|SF_VALGRIND)) == 0 && VG_(is_client_addr)(seg->addr);
}
@@ -1762,5 +1762,5 @@ void vg_sync_signalhandler ( Int sigNo,
VG_(deliver_signal)(tid, info);
VG_(resume_scheduler)(tid);
- exit(99); /* If we can't resume, then just exit */
+ VG_(exit)(99); /* If we can't resume, then just exit */
}
--- valgrind/include/x86-linux/vki_arch.h #1.12:1.13
@@ -326,4 +326,24 @@ struct vki_sigcontext {
//----------------------------------------------------------------------
+#define VKI_S_IFMT 00170000
+#define VKI_S_IFSOCK 0140000
+#define VKI_S_IFLNK 0120000
+#define VKI_S_IFREG 0100000
+#define VKI_S_IFBLK 0060000
+#define VKI_S_IFDIR 0040000
+#define VKI_S_IFCHR 0020000
+#define VKI_S_IFIFO 0010000
+#define VKI_S_ISUID 0004000
+#define VKI_S_ISGID 0002000
+#define VKI_S_ISVTX 0001000
+
+#define VKI_S_ISLNK(m) (((m) & VKI_S_IFMT) == VKI_S_IFLNK)
+#define VKI_S_ISREG(m) (((m) & VKI_S_IFMT) == VKI_S_IFREG)
+#define VKI_S_ISDIR(m) (((m) & VKI_S_IFMT) == VKI_S_IFDIR)
+#define VKI_S_ISCHR(m) (((m) & VKI_S_IFMT) == VKI_S_IFCHR)
+#define VKI_S_ISBLK(m) (((m) & VKI_S_IFMT) == VKI_S_IFBLK)
+#define VKI_S_ISFIFO(m) (((m) & VKI_S_IFMT) == VKI_S_IFIFO)
+#define VKI_S_ISSOCK(m) (((m) & VKI_S_IFMT) == VKI_S_IFSOCK)
+
struct vki_stat {
unsigned long st_dev;
|