summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/compat/linprocfs/linprocfs.c28
-rw-r--r--sys/fs/procfs/procfs_status.c28
2 files changed, 34 insertions, 22 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index 01b4c7cd1b05..f818651bf462 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -672,17 +672,23 @@ linprocfs_doproccmdline(PFS_FILL_ARGS)
* Linux behaviour is to return zero-length in this case.
*/
- if (p->p_args && (ps_argsopen || !p_cansee(td->td_proc, p))) {
- sbuf_bcpy(sb, p->p_args->ar_args, p->p_args->ar_length);
- } else if (p != td->td_proc) {
- sbuf_printf(sb, "%.*s", MAXCOMLEN, p->p_comm);
- } else {
- error = copyin((void*)PS_STRINGS, &pstr, sizeof(pstr));
- if (error)
- return (error);
- for (i = 0; i < pstr.ps_nargvstr; i++) {
- sbuf_copyin(sb, pstr.ps_argvstr[i], 0);
- sbuf_printf(sb, "%c", '\0');
+ if (ps_argsopen || !p_cansee(td->td_proc, p)) {
+ PROC_LOCK(p);
+ if (p->p_args) {
+ sbuf_bcpy(sb, p->p_args->ar_args, p->p_args->ar_length);
+ PROC_UNLOCK(p);
+ } else if (p != td->td_proc) {
+ sbuf_printf(sb, "%.*s", MAXCOMLEN, p->p_comm);
+ PROC_UNLOCK(p);
+ } else {
+ PROC_UNLOCK(p);
+ error = copyin((void*)PS_STRINGS, &pstr, sizeof(pstr));
+ if (error)
+ return (error);
+ for (i = 0; i < pstr.ps_nargvstr; i++) {
+ sbuf_copyin(sb, pstr.ps_argvstr[i], 0);
+ sbuf_printf(sb, "%c", '\0');
+ }
}
}
diff --git a/sys/fs/procfs/procfs_status.c b/sys/fs/procfs/procfs_status.c
index 9238dfe88681..86563ec7ce30 100644
--- a/sys/fs/procfs/procfs_status.c
+++ b/sys/fs/procfs/procfs_status.c
@@ -181,17 +181,23 @@ procfs_doproccmdline(PFS_FILL_ARGS)
* Linux behaviour is to return zero-length in this case.
*/
- if (p->p_args && (ps_argsopen || !p_cansee(td->td_proc, p))) {
- sbuf_bcpy(sb, p->p_args->ar_args, p->p_args->ar_length);
- } else if (p != td->td_proc) {
- sbuf_printf(sb, "%.*s", MAXCOMLEN, p->p_comm);
- } else {
- error = copyin((void*)PS_STRINGS, &pstr, sizeof(pstr));
- if (error)
- return (error);
- for (i = 0; i < pstr.ps_nargvstr; i++) {
- sbuf_copyin(sb, pstr.ps_argvstr[i], 0);
- sbuf_printf(sb, "%c", '\0');
+ if (ps_argsopen || !p_cansee(td->td_proc, p)) {
+ PROC_LOCK(p);
+ if (p->p_args) {
+ sbuf_bcpy(sb, p->p_args->ar_args, p->p_args->ar_length);
+ PROC_UNLOCK(p);
+ } else if (p != td->td_proc) {
+ sbuf_printf(sb, "%.*s", MAXCOMLEN, p->p_comm);
+ PROC_UNLOCK(p);
+ } else {
+ PROC_UNLOCK(p);
+ error = copyin((void*)PS_STRINGS, &pstr, sizeof(pstr));
+ if (error)
+ return (error);
+ for (i = 0; i < pstr.ps_nargvstr; i++) {
+ sbuf_copyin(sb, pstr.ps_argvstr[i], 0);
+ sbuf_printf(sb, "%c", '\0');
+ }
}
}