PERFORCE change 152045 for review
Peter Wemm
peter at FreeBSD.org
Mon Oct 27 20:25:09 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=152045
Change 152045 by peter at peter_freefall on 2008/10/27 20:24:17
Stop depending on the getpath kernel module. Re-parse the procfs curproc/map
file as needed after each mmap operation.
Affected files ...
.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#5 edit
.. //depot/projects/valgrind/coregrind/m_libcfile.c#6 edit
.. //depot/projects/valgrind/coregrind/m_main.c#7 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#5 (text+ko) ====
@@ -349,49 +349,48 @@
return ML_(am_get_fd_d_i_m)(fd, dev, ino, mode);
}
-/* Given a file descriptor, attempt to deduce its filename. To do
- this, we use /proc/self/fd/<FD>. If this doesn't point to a file,
- or if it doesn't exist, we return False. */
+
+/* Given a memory address, attempt to deduce its filename. To do
+ this, we use /proc/curproc/map. If this fails, return false. */
static
-Bool get_name_for_fd ( Int fd, HChar* buf, Int nbuf )
+Bool get_name_for_addr ( Addr search_addr, HChar* buf, Int nbuf )
{
- static int nr_fromfd = -1;
- SysRes res;
- Int i;
+ Int i;
- for (i = 0; i < nbuf; i++) buf[i] = 0;
- if (nr_fromfd == -1) {
- int oid[2];
- int real_oid[10];
- vki_size_t oidlen;
- char *name = "machdep.getpath_fromfd_num";
- vki_size_t len;
- int sc;
-
- oid[0] = 0; /* magic */
- oid[1] = 3; /* undocumented */
- oidlen = sizeof(real_oid);
- res = VG_(do_syscall6)(__NR___sysctl, (UWord)oid, 2, (UWord)real_oid, (UWord)&oidlen, (UWord)name, VG_(strlen)(name));
- oidlen /= sizeof(int);
- if (!res.isError && oidlen > 0) {
- len = sizeof(sc);
- res = VG_(do_syscall6)(__NR___sysctl, (UWord)real_oid, oidlen, (UWord)&sc, (UWord)&len, 0, 0);
- if (!res.isError && sc > 0)
- nr_fromfd = sc;
- }
- if (nr_fromfd == -1)
- nr_fromfd = -2;
+ /* Callback function for parsing map */
+ static void get_name_for_addr_callback(Addr addr, SizeT len, UInt prot,
+ ULong dev, ULong ino, ULong offset,
+ const UChar* filename )
+ {
+ if (search_addr < addr)
+ return;
+ if (search_addr > (addr + len - 1))
+ return;
+ VG_(strncpy)( buf, filename, nbuf - 1);
}
- if (nr_fromfd < 0)
- return False;
- res = VG_(do_syscall3)(nr_fromfd, fd, (UWord)buf, nbuf);
- if (!res.isError && buf[0] == '/')
+ for (i = 0; i < nbuf; i++) buf[i] = 0;
+ parse_procselfmaps( get_name_for_addr_callback, 0);
+ if (buf[0] == '/')
return True;
else
return False;
}
+/* Given a file descriptor, attempt to deduce its filename. To do
+ this, we use /proc/self/fd/<FD>. If this doesn't point to a file,
+ or if it doesn't exist, we return False. */
+static
+Bool get_name_for_fd ( Addr addr, Int fd, HChar* buf, Int nbuf )
+{
+ if (get_name_for_addr(addr, buf, nbuf)) {
+ if (0) VG_(debugLog)(0,"aspacem","get_name_for_addr succeeded %s!\n", buf);
+ return True;
+ }
+ if (0) VG_(debugLog)(0,"aspacem","get_name_for_addr failed!\n");
+ return False;
+}
+
/*-----------------------------------------------------------------*/
/*--- ---*/
@@ -1929,7 +1928,7 @@
seg.ino = ino;
seg.mode = mode;
}
- if (get_name_for_fd(fd, buf, VKI_PATH_MAX)) {
+ if (get_name_for_fd(a, fd, buf, VKI_PATH_MAX)) {
seg.fnIdx = allocate_segname( buf );
}
}
@@ -2144,7 +2143,7 @@
seg.ino = ino;
seg.mode = mode;
}
- if (get_name_for_fd(fd, buf, VKI_PATH_MAX)) {
+ if (get_name_for_fd(start, fd, buf, VKI_PATH_MAX)) {
seg.fnIdx = allocate_segname( buf );
}
add_segment( &seg );
@@ -2419,7 +2418,7 @@
seg.ino = ino;
seg.mode = mode;
}
- if (get_name_for_fd(fd, buf, VKI_PATH_MAX)) {
+ if (get_name_for_fd(seg.start, fd, buf, VKI_PATH_MAX)) {
seg.fnIdx = allocate_segname( buf );
}
add_segment( &seg );
@@ -3213,11 +3212,6 @@
foffset = 0;
}
-#if 0
- if (!filename)
- filename = find_path(start);
-#endif
-
prot = 0;
if (rr == 'r') prot |= VKI_PROT_READ;
if (ww == 'w') prot |= VKI_PROT_WRITE;
==== //depot/projects/valgrind/coregrind/m_libcfile.c#6 (text+ko) ====
@@ -92,30 +92,25 @@
SysRes res;
VG_(memset)(buf, 0, n_buf);
-//VG_(printf)("resolve_filename %d called\n", fd);
if (nr_fromfd == -1) {
- Int sc;
- Int error;
+ Int error, sc;
vki_size_t scl;
+ scl = sizeof(sc);
sc = -1;
- scl = sizeof(sc);
error = VG_(sysctlbyname)("machdep.getpath_fromfd_num", &sc, &scl, 0, 0);
if (error != -1 && sc > 0)
nr_fromfd = sc;
if (nr_fromfd == -1)
nr_fromfd = -2;
}
-//VG_(printf)("__getpath_fromfd syscall is %d\n", nr_fromfd);
if (nr_fromfd < 0)
return False;
res = VG_(do_syscall3)(nr_fromfd, fd, (UWord)buf, n_buf);
if (!res.isError && buf[0] == '/') {
-//VG_(printf)("__getpath_fromfd success path %s\n",buf);
return True;
} else {
-//VG_(printf)("__getpath_fromfd fail path %s\n",buf);
return False;
}
}
==== //depot/projects/valgrind/coregrind/m_main.c#7 (text+ko) ====
@@ -324,7 +324,7 @@
/* log to stderr by default, but usage message goes to stdout */
tmp_log_fd = 2;
-#if defined(VGO_freebsd)
+#if defined(VGO_freebsd) && 0
{
Int modid;
More information about the p4-projects
mailing list