Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 May 2018 22:10:39 -0400
From:      John Baldwin <jhb@FreeBSD.org>
To:        freebsd-arch@freebsd.org
Subject:   Re: Rationale for setting COMMLEN to 19 in struct kinfo_proc
Message-ID:  <6cdb7530-b689-7666-7ce4-9b91acfc6255@FreeBSD.org>
In-Reply-To: <20180530001638.GN99063@spindle.one-eyed-alien.net>
References:  <CALH631=XtWUMZnrz8%2BOH57GgY07pDY2du9OEOna6Pcd-zF=S8Q@mail.gmail.com> <20180530001638.GN99063@spindle.one-eyed-alien.net>

next in thread | previous in thread | raw e-mail | index | archive | help

-- 
John Baldwin
On 5/29/18 8:16 PM, Brooks Davis wrote:
> On Tue, May 29, 2018 at 11:42:47PM +0300, Gleb Popov wrote:
>> Hello.
>>
>> I've been debugging a failing Qt (KDE, to be precise) test and found that
>> process name returned in kinfo_proc structure gets truncated to 19 symbols.
>> This causes other errors in the application. I'm wondering why is this
>> field so small and is there possibility to increase it? I think, having
>> applications with names longer than 19 characters is not that rare.
>>
>> Relevant header: /usr/include/sys/user.h
>>
>> Simple testcase to feature the problem:
>>
>> # cat k.cpp
>> #include <sys/types.h>
>> #include <signal.h>
>> #include <unistd.h>
>> #include <stdio.h>
>>
>> #include <sys/cdefs.h>
>> #include <sys/param.h>
>> #include <sys/sysctl.h>
>> #include <sys/user.h>
>>
>> int main()
>> {
>>     auto pid = getpid();
>>     struct kinfo_proc kp;
>>     int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (int)pid };
>>
>>     size_t len = sizeof(kp);
>>     u_int mib_len = sizeof(mib)/sizeof(u_int);
>>
>>     if (sysctl(mib, mib_len, &kp, &len, NULL, 0) < 0)
>>         return -1;
>>
>>     puts(kp.ki_tdname);
>>     puts(kp.ki_comm);
>>
>>     return 0;
>> }
>> # c++ -o abcdefghijklmnopqrstuvwxyz
>> # ./abcdefghijklmnopqrstuvwxyz
>> abcdefghijklmnop
>> abcdefghijklmnopqrs
> 
> Changing the size of fields in kinfo_proc would be enormously
> disruptive.  Take a look at all the source that uses KERN_PROC_PID for a
> subset of things that would break.
> 
> Sometimes we can break these interfaces, but I think this one would
> require new sysctl mibs.  If we did that we should come up with an
> interface that is identical between 32-bit and 32-bit systems and
> doesn't export pointers.

p_comm[] in struct proc is only 20 bytes long (19 chars + nul), so you
can't make it bigger in kinfo_proc anyway as we only store 19 chars
in the kernel.  (Note that we do have room to grow char arrays if
needed without having to completely rototill though; we use a hack to
store the "rest" of the thread name in a separate array to export the
full 19 chars of the thread name now.)

If you want the raw command line you can't get that via kinfo_proc.
You can use the kern.proc.args sysctl or wrapper functions like
kvm_getargv() or procstat_getargv().  You can then use argv[0] as the
command name instead.

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6cdb7530-b689-7666-7ce4-9b91acfc6255>