aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linprocfs/linprocfs.c
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2020-10-20 17:24:29 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2020-10-20 17:24:29 +0000
commit91bc73618deae3a0d4efc467d94883c7e9fdd088 (patch)
tree57ff5db17fd5c6eda340949636297d4c92c39a2b /sys/compat/linprocfs/linprocfs.c
parent1a34e9fad6b6d894eb81002bd966684be1d1fe86 (diff)
Fix linprocfs(4) /proc/self/mem semantics to more closely match Linux.
Steam's Anti-Cheat might depend on it. PR: 248223 Analyzed by: Alex S <iwtcex@gmail.com> Reviewed by: kib MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26816
Notes
Notes: svn path=/head/; revision=366900
Diffstat (limited to 'sys/compat/linprocfs/linprocfs.c')
-rw-r--r--sys/compat/linprocfs/linprocfs.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index 992b86c614ca..c95661d52940 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -1276,6 +1276,27 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
}
/*
+ * Filler function for proc/pid/mem
+ */
+static int
+linprocfs_doprocmem(PFS_FILL_ARGS)
+{
+ ssize_t resid;
+ int error;
+
+ resid = uio->uio_resid;
+ error = procfs_doprocmem(PFS_FILL_ARGNAMES);
+
+ if (uio->uio_rw == UIO_READ && resid != uio->uio_resid)
+ return (0);
+
+ if (error == EFAULT)
+ error = EIO;
+
+ return (error);
+}
+
+/*
* Criteria for interface name translation
*/
#define IFP_IS_ETH(ifp) (ifp->if_type == IFT_ETHER)
@@ -1853,7 +1874,7 @@ linprocfs_init(PFS_INIT_ARGS)
NULL, &procfs_notsystem, NULL, 0);
pfs_create_file(dir, "maps", &linprocfs_doprocmaps,
NULL, NULL, NULL, PFS_RD);
- pfs_create_file(dir, "mem", &procfs_doprocmem,
+ pfs_create_file(dir, "mem", &linprocfs_doprocmem,
procfs_attr_rw, &procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
pfs_create_file(dir, "mounts", &linprocfs_domtab,
NULL, NULL, NULL, PFS_RD);