Solar Designer wrote on Fri, Dec 23, 2022 at 12:21:12AM +0100: > On Fri, Dec 23, 2022 at 07:03:17AM +0900, Dominique Martinet wrote: > > Alexey Dobriyan wrote on Thu, Dec 22, 2022 at 07:42:53PM +0300: > > > --- a/man5/proc.5 > > > +++ b/man5/proc.5 > > > @@ -2092,6 +2092,11 @@ Strings longer than > > > .B TASK_COMM_LEN > > > (16) characters (including the terminating null byte) are silently truncated. > > > This is visible whether or not the executable is swapped out. > > > + > > > +Note that \fIcomm\fP can contain space and closing parenthesis characters. > > > +Parsing /proc/${pid}/stat with split() or equivalent, or scanf(3) isn't > > > +reliable. The correct way is to locate closing parenthesis with strrchr(')') > > > +from the end of the buffer and parse integers from there. > > > > That's still not enough unless new lines are escaped, which they aren't: > > > > $ echo -n 'test) 0 0 0 > > ' > /proc/$$/comm > > $ cat /proc/$$/stat > > 71076 (test) 0 0 0 > > ) S 71075 71076 71076 34840 71192 4194304 6623 6824 0 0 10 3 2 7 20 0 1 0 36396573 15208448 2888 18446744073709551615 94173281726464 94173282650929 140734972513568 0 0 0 65536 3686404 1266761467 1 0 0 17 1 0 0 0 0 0 94173282892592 94173282940880 94173287231488 140734972522071 140734972522076 140734972522076 140734972526574 0 > > > > The silver lining here is that comm length is rather small (16) so we > > cannot emulate full lines and a very careful process could notice that > > there are not enough fields after the last parenthesis... So just look > > for the last closing parenthesis in the next line and try again? > > No, just don't treat this file's content as a line (nor as several > lines) - treat it as a string that might contain new line characters. Ah, this came just after the /proc/net/unix discussion in another thread[1] pointing to [2] with one line per entry, and I was still in that mode. For /proc/pid/stat with a single entry I agree treating it as a buffer and looking for the last closing parenthesis should be correct as per the man page suggestion -- sorry for the noise. [1] https://www.openwall.com/lists/oss-security/2022/12/21/8 [2] https://lore.kernel.org/all/8a87957e-4d33-9351-ae74-243441cb03cd@xxxxxxxxxx/ -- Dominique Martinet | Asmadeus