From 2c34fd40cf9b5ba7ec3d068fc410a06bc897665b Mon Sep 17 00:00:00 2001 From: jilles Date: Sat, 18 Jun 2011 23:01:26 +0000 Subject: [PATCH] libprocstat: For MAP_PRIVATE, do not consider the file open for writing. If a file is mapped with with MAP_PRIVATE, no write permission is required and changes do not end up in the file. Therefore, tools like fuser and fstat should not show the file as open for writing. The protection as displayed by procstat -v still includes write in this case, and shows 'C' for copy-on-write. --- lib/libprocstat/libprocstat.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c index 65e170de7280..22ca668e4b3a 100644 --- a/lib/libprocstat/libprocstat.c +++ b/lib/libprocstat/libprocstat.c @@ -522,7 +522,8 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap fflags = 0; if (prot & VM_PROT_READ) fflags = PS_FST_FFLAG_READ; - if (prot & VM_PROT_WRITE) + if ((vmentry.eflags & MAP_ENTRY_COW) == 0 && + prot & VM_PROT_WRITE) fflags |= PS_FST_FFLAG_WRITE; /* @@ -696,7 +697,8 @@ procstat_getfiles_sysctl(struct procstat *procstat, struct kinfo_proc *kp, int m fflags = 0; if (kve->kve_protection & KVME_PROT_READ) fflags = PS_FST_FFLAG_READ; - if (kve->kve_protection & KVME_PROT_WRITE) + if ((kve->kve_flags & KVME_FLAG_COW) == 0 && + kve->kve_protection & KVME_PROT_WRITE) fflags |= PS_FST_FFLAG_WRITE; offset = kve->kve_offset; refcount = kve->kve_ref_count;