Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Oct 2008 21:31:38 +0400 (MSD)
From:      dchagin@FreeBSD.org
To:        bug-followup@FreeBSD.org, gibbs@scsiguy.com
Cc:        freebsd-emulation@FreeBSD.org
Subject:   Re: kern/101453: [linux] [patch] linprocfs disallows
Message-ID:  <200810011731.m91HVcte006117@dchagin.dialup.corbina.ru>

next in thread | raw e-mail | index | archive | help
>   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@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!



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810011731.m91HVcte006117>