[packages/procps] - added fix for w -s segfault

mrozowik mrozowik at pld-linux.org
Mon Jun 17 14:12:54 CEST 2024


commit 2db8d276f33fdc4df071cf2dcea72ee1d161595c
Author: Krzysztof Mrozowicz <mrozowik at pld-linux.org>
Date:   Mon Jun 17 12:11:11 2024 +0000

    - added fix for w -s segfault

 79042e07fab9956135a21b1df7a69d1fbde7ef79.patch | 161 +++++++++++++++++++++++++
 procps.spec                                    |   5 +-
 2 files changed, 165 insertions(+), 1 deletion(-)
---
diff --git a/procps.spec b/procps.spec
index 9dc1b6e..047d611 100644
--- a/procps.spec
+++ b/procps.spec
@@ -22,7 +22,7 @@ Summary(pt_BR.UTF-8):	Utilitários de monitoração de processos
 Summary(tr.UTF-8):	Süreç izleme araçları
 Name:		procps
 Version:	4.0.4
-Release:	1
+Release:	2
 Epoch:		1
 License:	GPL v2+
 Group:		Applications/System
@@ -37,6 +37,8 @@ Source4:	XConsole.sh
 
 Patch1:		%{name}-FILLBUG_backport.patch
 Patch2:		%{name}-pl.po-update.patch
+# [PATCH] w: Don't crash when using short option
+Patch3:		79042e07fab9956135a21b1df7a69d1fbde7ef79.patch
 URL:		https://gitlab.com/procps-ng/procps
 BuildRequires:	autoconf >= 2.69
 BuildRequires:	automake >= 1:1.11
@@ -150,6 +152,7 @@ Statyczna wersja biblioteki libproc.
 
 %patch1 -p1
 %patch2 -p1
+%patch3 -p1
 
 %{__sed} -i -e "s#usrbin_execdir=.*#usrbin_execdir='\${bindir}'#g" configure.ac
 
diff --git a/79042e07fab9956135a21b1df7a69d1fbde7ef79.patch b/79042e07fab9956135a21b1df7a69d1fbde7ef79.patch
new file mode 100644
index 0000000..78db889
--- /dev/null
+++ b/79042e07fab9956135a21b1df7a69d1fbde7ef79.patch
@@ -0,0 +1,161 @@
+From 79042e07fab9956135a21b1df7a69d1fbde7ef79 Mon Sep 17 00:00:00 2001
+From: Craig Small <csmall at dropbear.xyz>
+Date: Tue, 12 Sep 2023 16:59:18 +1000
+Subject: [PATCH] ps: Don't crash when using short option
+
+ps would crash with the -si or -sf options with systemd enabled.
+The issue was the utmp wasn't filled in, the long option checked, the
+short option did not.
+
+Refactored the showinfo() function so instead of a branch with duplicate
+prints for the items in both long and short we just branch on the items
+for long output.
+
+Also, made the function prototypes not dependendent on systemd enabled,
+it was too messy that way and passing a char* NULL is not really going
+to hurt anything.
+
+References:
+ #301
+
+Signed-off-by: Craig Small <csmall at dropbear.xyz>
+ ---------------
+diff --git a/src/w.c b/src/w.c
+index fd6e75f7..e2d754b5 100644
+--- a/src/w.c
++++ b/src/w.c
+@@ -207,9 +207,7 @@ static void print_display_or_interface(const char *restrict host, int len, int r
+ 
+ /* This routine prints either the hostname or the IP address of the remote */
+ static void print_from(
+-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ 		       const char *session,
+-#endif
+ 		       const utmp_t *restrict const u, const int ip_addresses, const int fromlen) {
+ #if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+         if (session) {
+@@ -508,11 +506,10 @@ static int find_best_proc(
+ #undef PIDS_GETSTR
+ }
+ 
++
+ static void showinfo(
+-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+             const char *session, const char *name,
+-#endif
+-            utmp_t * u, int formtype, int maxcmd, int from,
++            utmp_t * u, const int longform, int maxcmd, int from,
+             const int userlen, const int fromlen, const int ip_addresses,
+             const int pids)
+ {
+@@ -575,25 +572,20 @@ static void showinfo(
+     /* force NUL term for printf */
+     uname[UT_NAMESIZE] = '\0';
+ 
+-    if (formtype) {
+-        printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
++    printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
++    if (from)
++        print_from(session, NULL, ip_addresses, fromlen);
++
++    /* login time */
++    if (longform) {
+ #if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+         if (session) {
+             uint64_t ltime;
+ 
+-            if (from)
+-              print_from(session, NULL, ip_addresses, fromlen);
+-
+             sd_session_get_start_time(session, &ltime);
+             print_logintime(ltime/((uint64_t) 1000000ULL), stdout);
+         } else {
+ #endif
+-            if (from)
+-                print_from(
+-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+-			   NULL,
+-#endif
+-			   u, ip_addresses, fromlen);
+ 
+ #ifdef HAVE_UTMPX_H
+             print_logintime(u->ut_tv.tv_sec, stdout);
+@@ -603,11 +595,16 @@ static void showinfo(
+ #if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+         }
+ #endif
+-        if (u && *u->ut_line == ':')
+-            /* idle unknown for xdm logins */
+-            printf(" ?xdm? ");
+-        else
+-            print_time_ival7(idletime(tty), 0, stdout);
++    }
++    /* idle */
++    if (u && *u->ut_line == ':')
++        /* idle unknown for xdm logins */
++        printf(" ?xdm? ");
++    else
++        print_time_ival7(idletime(tty), 0, stdout);
++
++    /* jpcpu/pcpu */
++    if (longform) {
+         print_time_ival7(jcpu / hertz, (jcpu % hertz) * (100. / hertz),
+                  stdout);
+         if (pcpu > 0)
+@@ -616,20 +613,8 @@ static void showinfo(
+                              stdout);
+         else
+             printf("   ?   ");
+-    } else {
+-        printf("%-*.*s%-9.8s", userlen + 1, userlen, uname, tty + 5);
+-        if (from)
+-	    print_from(
+-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+-		       NULL,
+-#endif
+-		       u, ip_addresses, fromlen);
+-        if (u && *u->ut_line == ':')
+-            /* idle unknown for xdm logins */
+-            printf(" ?xdm? ");
+-        else
+-            print_time_ival7(idletime(tty), 0, stdout);
+     }
++    /* what */
+     if (pids) {
+         pid_t ut_pid = -1;
+         if (u)
+@@ -798,9 +783,9 @@ int main(int argc, char **argv)
+ 		 * headers. Try to keep alignment intact.  */
+ 		printf(_("%-*s TTY      "), userlen, _("USER"));
+ 		if (from)
+-			printf("%-*s", fromlen - 1, _("FROM"));
++			printf("%-*s", fromlen, _("FROM"));
+ 		if (longform)
+-			printf(_("  LOGIN@   IDLE   JCPU   PCPU WHAT\n"));
++			printf(_(" LOGIN@   IDLE   JCPU   PCPU  WHAT\n"));
+ 		else
+ 			printf(_("   IDLE WHAT\n"));
+ 	}
+@@ -857,9 +842,7 @@ int main(int argc, char **argv)
+ 				continue;
+ 			if (!strncmp(u->ut_user, user, UT_NAMESIZE))
+ 				showinfo(
+-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ 					 NULL, NULL,
+-#endif
+ 					 u, longform, maxcmd, from, userlen,
+ 					 fromlen, ip_addresses, pids);
+ 		}
+@@ -876,9 +859,7 @@ int main(int argc, char **argv)
+ 				continue;
+ 			if (*u->ut_user)
+ 				showinfo(
+-#if (defined(WITH_SYSTEMD) || defined(WITH_ELOGIND)) && defined(HAVE_SD_SESSION_GET_LEADER)
+ 					 NULL, NULL,
+-#endif
+ 					 u, longform, maxcmd, from, userlen,
+ 					 fromlen, ip_addresses, pids);
+ 		}
+-- 
+GitLab
+
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/procps.git/commitdiff/2db8d276f33fdc4df071cf2dcea72ee1d161595c



More information about the pld-cvs-commit mailing list