Author: trociny
Date: Tue Nov 22 20:43:03 2011
New Revision: 227834
URL: http://svn.freebsd.org/changeset/base/227834

Log:
  In procfs_doproccmdline() if arguments are not cashed read them from
  the process stack.
  
  Suggested by: kib
  Reviewed by:  kib
  Tested by:    pho
  MFC after:    2 weeks

Modified:
  head/sys/fs/procfs/procfs_status.c

Modified: head/sys/fs/procfs/procfs_status.c
==============================================================================
--- head/sys/fs/procfs/procfs_status.c  Tue Nov 22 20:40:18 2011        
(r227833)
+++ head/sys/fs/procfs/procfs_status.c  Tue Nov 22 20:43:03 2011        
(r227834)
@@ -170,15 +170,10 @@ procfs_doprocstatus(PFS_FILL_ARGS)
 int
 procfs_doproccmdline(PFS_FILL_ARGS)
 {
-       struct ps_strings pstr;
-       char **ps_argvstr;
-       int error, i;
 
        /*
         * If we are using the ps/cmdline caching, use that.  Otherwise
-        * revert back to the old way which only implements full cmdline
-        * for the current process and just p->p_comm for all other
-        * processes.
+        * read argv from the process space.
         * Note that if the argv is no longer available, we deliberately
         * don't fall back on p->p_comm or return an error: the authentic
         * Linux behaviour is to return zero-length in this case.
@@ -190,30 +185,13 @@ procfs_doproccmdline(PFS_FILL_ARGS)
                PROC_UNLOCK(p);
                return (0);
        }
-       PROC_UNLOCK(p);
-       if (p != td->td_proc) {
-               sbuf_printf(sb, "%.*s", MAXCOMLEN, p->p_comm);
-       } else {
-               error = copyin((void *)p->p_sysent->sv_psstrings, &pstr,
-                   sizeof(pstr));
-               if (error)
-                       return (error);
-               if (pstr.ps_nargvstr > ARG_MAX)
-                       return (E2BIG);
-               ps_argvstr = malloc(pstr.ps_nargvstr * sizeof(char *),
-                   M_TEMP, M_WAITOK);
-               error = copyin((void *)pstr.ps_argvstr, ps_argvstr,
-                   pstr.ps_nargvstr * sizeof(char *));
-               if (error) {
-                       free(ps_argvstr, M_TEMP);
-                       return (error);
-               }
-               for (i = 0; i < pstr.ps_nargvstr; i++) {
-                       sbuf_copyin(sb, ps_argvstr[i], 0);
-                       sbuf_printf(sb, "%c", '\0');
-               }
-               free(ps_argvstr, M_TEMP);
+
+       if ((p->p_flag & P_SYSTEM) != 0) {
+               PROC_UNLOCK(p);
+               return (0);
        }
 
-       return (0);
+       PROC_UNLOCK(p);
+
+       return (proc_getargv(td, p, sb, ARG_MAX));
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to