Hi! I wanted to look at the process table of a crashed kernel from a dump. ps(1) then segfaulted.
It seems that 1) pr->ps_pgrp is kernel's (it's being kvm_read earlier in libkvm) and so is ps_session 2) p_comm and s_login are part of their structs and not pointers, therefore kvm_read() a. k. a. copy_str() doesn't work on them. I couldn't fix argv to display properly, but this is already better than a segfault. Tested only on i386. Reproduce: 1) C-M-Esc, boot crash 2) ps -N /var/crash/bsd.? -M /var/crash/bsd.?.core 3) when trying the diff, don't forget to recompile libkvm AND ps Anyone has anything to say or is willing to commit? -- Martin Pelikan Index: sys/sysctl.h =================================================================== RCS file: /cvs/src/sys/sys/sysctl.h,v retrieving revision 1.116 diff -u -p -r1.116 sysctl.h --- sys/sysctl.h 8 Jul 2011 18:38:55 -0000 1.116 +++ sys/sysctl.h 18 Aug 2011 11:16:35 -0000 @@ -482,7 +482,7 @@ do { \ (kp)->p_limit = PTRTOINT64((pr)->ps_limit); \ (kp)->p_vmspace = PTRTOINT64((p)->p_vmspace); \ (kp)->p_sigacts = PTRTOINT64((p)->p_sigacts); \ - (kp)->p_sess = PTRTOINT64((pr)->ps_session); \ + (kp)->p_sess = PTRTOINT64(sess); \ (kp)->p_ru = PTRTOINT64((p)->p_ru); \ \ (kp)->p_exitsig = (p)->p_exitsig; \ @@ -528,11 +528,11 @@ do { \ (kp)->p_xstat = (p)->p_xstat; \ (kp)->p_acflag = (p)->p_acflag; \ \ - /* XXX depends on p_emul being an array and not a pointer */ \ + /* p_emul is a pointer and not an array */ \ copy_str((kp)->p_emul, (char *)(p)->p_emul + \ offsetof(struct emul, e_name), sizeof((kp)->p_emul)); \ - copy_str((kp)->p_comm, (p)->p_comm, sizeof((kp)->p_comm)); \ - copy_str((kp)->p_login, (sess)->s_login, \ + (void) memcpy((kp)->p_comm, (p)->p_comm, sizeof((kp)->p_comm)); \ + (void) memcpy((kp)->p_login, (sess)->s_login, \ MIN(sizeof((kp)->p_login) - 1, sizeof((sess)->s_login))); \ \ if ((sess)->s_ttyvp) \