mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-11-07 04:36:52 -10:00
procfs, linprocfs: ensure target process vmspace stability
Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57497
This commit is contained in:
1 parent
a4993bac41
commit
5db31f1b47
3 files changed
+13
-26
No files matched your search
@@ -1311,19 +1311,13 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
|
||||
struct vattr vat;
|
||||
bool private;
|
||||
|
||||
PROC_LOCK(p);
|
||||
error = p_candebug(td, p);
|
||||
PROC_UNLOCK(p);
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
if (uio->uio_rw != UIO_READ)
|
||||
return (EOPNOTSUPP);
|
||||
|
||||
error = 0;
|
||||
vm = vmspace_acquire_ref(p);
|
||||
if (vm == NULL)
|
||||
return (ESRCH);
|
||||
error = proc_vmspace_ref(td, p, PRVM_BLOCK_EXEC | PRVM_CHECK_DEBUG,
|
||||
&vm);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
if (SV_CURPROC_FLAG(SV_LP64))
|
||||
l_map_str = l64_map_str;
|
||||
@@ -1421,7 +1415,7 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
|
||||
}
|
||||
}
|
||||
vm_map_unlock_read(map);
|
||||
vmspace_free(vm);
|
||||
proc_vmspace_unref(td, p, PRVM_CHECK_DEBUG | PRVM_BLOCK_EXEC, vm);
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/resourcevar.h>
|
||||
#include <sys/rwlock.h>
|
||||
#include <sys/sbuf.h>
|
||||
@@ -93,15 +94,14 @@ procfs_doprocmap(PFS_FILL_ARGS)
|
||||
bool wrap32;
|
||||
#endif
|
||||
|
||||
PROC_LOCK(p);
|
||||
error = p_candebug(td, p);
|
||||
PROC_UNLOCK(p);
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
if (uio->uio_rw != UIO_READ)
|
||||
return (EOPNOTSUPP);
|
||||
|
||||
error = proc_vmspace_ref(td, p, PRVM_BLOCK_EXEC | PRVM_CHECK_DEBUG,
|
||||
&vm);
|
||||
if (error != 0)
|
||||
return (error);
|
||||
|
||||
#ifdef COMPAT_FREEBSD32
|
||||
wrap32 = false;
|
||||
if (SV_CURPROC_FLAG(SV_ILP32)) {
|
||||
@@ -111,9 +111,6 @@ procfs_doprocmap(PFS_FILL_ARGS)
|
||||
}
|
||||
#endif
|
||||
|
||||
vm = vmspace_acquire_ref(p);
|
||||
if (vm == NULL)
|
||||
return (ESRCH);
|
||||
map = &vm->vm_map;
|
||||
vm_map_lock_read(map);
|
||||
VM_MAP_ENTRY_FOREACH(entry, map) {
|
||||
@@ -238,6 +235,6 @@ procfs_doprocmap(PFS_FILL_ARGS)
|
||||
}
|
||||
}
|
||||
vm_map_unlock_read(map);
|
||||
vmspace_free(vm);
|
||||
proc_vmspace_unref(td, p, PRVM_BLOCK_EXEC | PRVM_CHECK_DEBUG, vm);
|
||||
return (error);
|
||||
}
|
||||
@@ -60,11 +60,7 @@ procfs_doprocmem(PFS_FILL_ARGS)
|
||||
if (uio->uio_resid == 0)
|
||||
return (0);
|
||||
|
||||
PROC_LOCK(p);
|
||||
error = p_candebug(td, p);
|
||||
PROC_UNLOCK(p);
|
||||
if (error == 0)
|
||||
error = proc_rwmem(p, uio, 0);
|
||||
error = proc_rwmem(p, uio, PRVM_CHECK_DEBUG | PRVM_BLOCK_EXEC);
|
||||
|
||||
return (error);
|
||||
}
|
||||
Reference in new issue
Block a user