[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, <ime);
+ 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