kern/101453: [linux] [patch] linprocfs disallows
dchagin at FreeBSD.org
dchagin at FreeBSD.org
Wed Oct 1 17:31:47 UTC 2008
> Unformatted:
> The original implementation of this routine should have placed its
> output into the sbuf provided as an argument. The following untested
> patch from des at FreeBSD.org converts the code to make use of the sbuf.
> Once the sbuf is properly filled, pseudofs should take care of handling
> any offset into the fd.
> Index: sys/compat/linprocfs/linprocfs.c
> ===================================================================
more comments:
glibc pthread_getattr_np() uses /proc/self/maps for thread stack address &&
size calculation. Linux applications which uses NPTL cannot work without
this patch. I have a little corrected a patch and have tested it with
linux-flashplugin9. It works fine. It would be excellent to commit it and
make MFC to RELENG_7 before 7.1R! Many our users waits it.
Fix:
diff --git a/src/sys/compat/linprocfs/linprocfs.c b/src/sys/compat/linprocfs/linprocfs.c
index dd4bf77..715146a 100644
--- a/src/sys/compat/linprocfs/linprocfs.c
+++ b/src/sys/compat/linprocfs/linprocfs.c
@@ -872,14 +872,12 @@ linprocfs_doprocenviron(PFS_FILL_ARGS)
static int
linprocfs_doprocmaps(PFS_FILL_ARGS)
{
- char mebuffer[512];
vm_map_t map = &p->p_vmspace->vm_map;
vm_map_entry_t entry, tmp_entry;
vm_object_t obj, tobj, lobj;
vm_offset_t saved_end;
vm_ooffset_t off = 0;
char *name = "", *freename = NULL;
- size_t len;
ino_t ino;
unsigned int last_timestamp;
int ref_count, shadow_count, flags;
@@ -897,13 +895,9 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
if (uio->uio_rw != UIO_READ)
return (EOPNOTSUPP);
- if (uio->uio_offset != 0)
- return (0);
-
error = 0;
vm_map_lock_read(map);
- for (entry = map->header.next;
- ((uio->uio_resid > 0) && (entry != &map->header));
+ for (entry = map->header.next; entry != &map->header;
entry = entry->next) {
name = "";
freename = NULL;
@@ -952,7 +946,7 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
* format:
* start, end, access, offset, major, minor, inode, name.
*/
- snprintf(mebuffer, sizeof mebuffer,
+ error = sbuf_printf(sb,
"%08lx-%08lx %s%s%s%s %08lx %02x:%02x %lu%s%s\n",
(u_long)entry->start, (u_long)entry->end,
(entry->protection & VM_PROT_READ)?"r":"-",
@@ -968,18 +962,11 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
);
if (freename)
free(freename, M_TEMP);
- len = strlen(mebuffer);
- if (len > uio->uio_resid)
- len = uio->uio_resid; /*
- * XXX We should probably return
- * EFBIG here, as in procfs.
- */
last_timestamp = map->timestamp;
vm_map_unlock_read(map);
- error = uiomove(mebuffer, len, uio);
+ if (error == -1)
+ return (0);
vm_map_lock_read(map);
- if (error)
- break;
if (last_timestamp + 1 != map->timestamp) {
/*
* Look again for the entry because the map was
--
chd,
Have fun!
More information about the freebsd-emulation
mailing list