674af5d4ca
C99 says that the %15c conversion specifier matches *exactly* 15
characters, so if the process name is shorter than 15 characters,
it is not matched and 0 is returned. Some implementations (such as
glibc) return a match, even with fewer characters than the field
width, but this cannot be assumed.
Instead, use %15[^)], as in upstream commit [0], which matches a
non-empty sequence of characters other than ')'.
[0] ca2b176889
118 lines
3.4 KiB
Text
118 lines
3.4 KiB
Text
$NetBSD: patch-af,v 1.7 2020/10/06 00:19:05 mcf Exp $
|
|
|
|
Need limits.h for PATH_MAX
|
|
|
|
Fix sscanf usage bug on musl libc and uclibc (upstream commit
|
|
https://gitlab.com/psmisc/psmisc/-/commit/ca2b176889729a7347bd95b832b9a5bb39fec229)
|
|
|
|
--- src/pstree.c.orig 2000-12-18 05:59:23.000000000 +0000
|
|
+++ src/pstree.c
|
|
@@ -15,19 +15,22 @@
|
|
#include <getopt.h>
|
|
#include <pwd.h>
|
|
#include <dirent.h>
|
|
+#include <limits.h>
|
|
#include <termios.h>
|
|
+#ifdef HAVE_TERMCAP_H
|
|
#include <termcap.h>
|
|
+#endif
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/ioctl.h>
|
|
|
|
#include "comm.h"
|
|
+#include "procfs.h"
|
|
|
|
|
|
#ifndef MAX_DEPTH
|
|
#define MAX_DEPTH 100
|
|
#endif
|
|
-#define PROC_BASE "/proc"
|
|
|
|
/* UTF-8 defines by Johan Myreen */
|
|
#define UTF_V "\342\224\202\277" /* Vertical line drawing char */
|
|
@@ -303,6 +306,7 @@ dump_tree (PROC * current, int level, in
|
|
const struct passwd *pw;
|
|
int lvl, i, add, offset, len, swapped, info, count, comm_len, first;
|
|
const char *tmp, *here;
|
|
+ char tbuf[1024], *pbuf;
|
|
char comm_tmp[5];
|
|
|
|
if (!current)
|
|
@@ -327,7 +331,8 @@ dump_tree (PROC * current, int level, in
|
|
add = out_int (rep) + 2;
|
|
out_string ("*[");
|
|
}
|
|
- if (current->highlight && (tmp = tgetstr ("md", NULL)))
|
|
+ pbuf = tbuf;
|
|
+ if (current->highlight && (tmp = tgetstr ("md", &pbuf)))
|
|
tputs (tmp, 1, putchar);
|
|
if ((swapped = print_args) && current->argc < 0)
|
|
out_char ('(');
|
|
@@ -366,7 +371,8 @@ dump_tree (PROC * current, int level, in
|
|
}
|
|
if (info || swapped)
|
|
out_char (')');
|
|
- if (current->highlight && (tmp = tgetstr ("me", NULL)))
|
|
+ pbuf = tbuf;
|
|
+ if (current->highlight && (tmp = tgetstr ("me", &pbuf)))
|
|
tputs (tmp, 1, putchar);
|
|
if (print_args)
|
|
{
|
|
@@ -504,7 +510,7 @@ read_proc (void)
|
|
while ((de = readdir (dir)) != NULL)
|
|
if ((pid = atoi (de->d_name)) != 0)
|
|
{
|
|
- sprintf (path, "%s/%d/stat", PROC_BASE, pid);
|
|
+ sprintf (path, "%s/%d/%s", PROC_BASE, pid, STATUS_FILE);
|
|
if ((file = fopen (path, "r")) != NULL)
|
|
{
|
|
empty = 0;
|
|
@@ -513,16 +519,19 @@ read_proc (void)
|
|
perror (path);
|
|
exit (1);
|
|
}
|
|
+#ifdef BSD_44_PROCFS
|
|
+ if (fscanf(file, "%s %*d %d", comm, &ppid) == 2)
|
|
+ { { {
|
|
+#else
|
|
fread(readbuf, BUFSIZ, 1, file) ;
|
|
if (ferror(file) == 0)
|
|
{
|
|
memset(comm, '\0', COMM_LEN+1);
|
|
tmpptr = strrchr(readbuf, ')'); /* find last ) */
|
|
- *tmpptr = '\0';
|
|
/* We now have readbuf with pid and cmd, and tmpptr+2
|
|
* with the rest */
|
|
/*printf("readbuf: %s\n", readbuf);*/
|
|
- if (sscanf(readbuf, "%*d (%15c", comm) == 1)
|
|
+ if (sscanf(readbuf, "%*d (%15[^)]", comm) == 1)
|
|
{
|
|
/*printf("tmpptr: %s\n", tmpptr+2);*/
|
|
if (sscanf(tmpptr+2, "%*c %d", &ppid) == 1)
|
|
@@ -532,11 +541,12 @@ read_proc (void)
|
|
(file, "%d (%s) %c %d", &dummy, comm, (char *) &dummy,
|
|
&ppid) == 4)
|
|
*/
|
|
+#endif
|
|
if (!print_args)
|
|
add_proc (comm, pid, ppid, st.st_uid, NULL, 0);
|
|
else
|
|
{
|
|
- sprintf (path, "%s/%d/cmdline", PROC_BASE, pid);
|
|
+ sprintf (path, "%s/%d/%s", PROC_BASE, pid, CMDLINE_FILE);
|
|
if ((fd = open (path, O_RDONLY)) < 0)
|
|
{
|
|
perror (path);
|
|
@@ -641,7 +651,11 @@ main (int argc, char **argv)
|
|
switch (c)
|
|
{
|
|
case 'a':
|
|
+#if defined(BSD_44_PROCFS) && !defined(BSD_PROCFS_CMDLINE)
|
|
+ print_args = 0;
|
|
+#else
|
|
print_args = 1;
|
|
+#endif
|
|
break;
|
|
case 'c':
|
|
compact = 0;
|