Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package rsyslog for openSUSE:Factory checked 
in at 2023-11-14 21:41:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rsyslog (Old)
 and      /work/SRC/openSUSE:Factory/.rsyslog.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rsyslog"

Tue Nov 14 21:41:43 2023 rev:175 rq:1125597 version:8.2306.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/rsyslog/rsyslog.changes  2023-10-26 
17:12:23.499801453 +0200
+++ /work/SRC/openSUSE:Factory/.rsyslog.new.17445/rsyslog.changes       
2023-11-14 21:41:48.073885093 +0100
@@ -1,0 +2,15 @@
+Wed Oct 25 08:27:13 UTC 2023 - Thomas Blume <thomas.bl...@suse.com>
+
+- use logind instead of utmp for wall messages with systemd
+
+Future SUSE versions will get rid of utmp due to a 32bit time_t counter
+overflow in 2038.
+See details at:
+
+https://github.com/thkukuk/utmpx/blob/main/Y2038.md
+
+On systemd based systems logind is an alternative to utmp.
+
+* add: 0001-use-logind-instead-of-utmp-for-wall-messages-with-sy.patch
+
+-------------------------------------------------------------------

New:
----
  0001-use-logind-instead-of-utmp-for-wall-messages-with-sy.patch

BETA DEBUG BEGIN:
  New:
* add: 0001-use-logind-instead-of-utmp-for-wall-messages-with-sy.patch
BETA DEBUG END:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rsyslog.spec ++++++
--- /var/tmp/diff_new_pack.fbG6PG/_old  2023-11-14 21:41:49.189926406 +0100
+++ /var/tmp/diff_new_pack.fbG6PG/_new  2023-11-14 21:41:49.193926554 +0100
@@ -222,6 +222,8 @@
 Source18:       firewall.frule
 Source19:       NetworkManager.frule
 
+Patch1:         0001-use-logind-instead-of-utmp-for-wall-messages-with-sy.patch
+
 # this is a dirty hack since % dir does only work for the specified directory 
and nothing above
 # but I want to be able to switch this to /etc/apparmor.d once the profiles 
received more testing
 %define APPARMOR_PROFILE_PATH /usr/share/apparmor/extra-profiles
@@ -581,6 +583,7 @@
 
 # for patch1
 autoreconf -fiv
+%autopatch -p1
 
 %configure                     \
        --with-moddirs=%{rsyslog_module_dir_withdeps} \

++++++ 0001-use-logind-instead-of-utmp-for-wall-messages-with-sy.patch ++++++
>From 87c31b946d8d0a230f2db842328067eb5d8c5b08 Mon Sep 17 00:00:00 2001
From: Thomas Blume <thomas.bl...@suse.com>
Date: Wed, 18 Oct 2023 16:22:45 +0200
Subject: [PATCH] use logind instead of utmp for wall messages with systemd

Future SUSE versions will get rid of utmp due to a 32bit time_t counter
overflow in 2038.
See details at:

https://github.com/thkukuk/utmpx/blob/main/Y2038.md

On systemd based systems logind is an alternative to utmp.
---
 tools/omusrmsg.c | 142 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 110 insertions(+), 32 deletions(-)

diff --git a/tools/omusrmsg.c b/tools/omusrmsg.c
index 6086d2d6b..aaa36d9e5 100644
--- a/tools/omusrmsg.c
+++ b/tools/omusrmsg.c
@@ -56,6 +56,11 @@
 #ifdef HAVE_PATHS_H
 #include <paths.h>
 #endif
+#ifdef HAVE_LIBSYSTEMD
+#include <systemd/sd-daemon.h>
+#include <systemd/sd-login.h>
+#include <pwd.h>
+#endif
 #include "rsyslog.h"
 #include "srUtils.h"
 #include "stringbuf.h"
@@ -201,6 +206,42 @@ void endutent(void)
 #endif  /* #ifdef OS_BSD */
 
 
+static void sendwallmsg(const char *tty, uchar* pMsg)
+{
+       uchar szErr[512];
+       int errnoSave;
+       char p[sizeof(_PATH_DEV) + UNAMESZ];
+       int ttyf;
+       struct stat statb;
+       int wrRet;
+
+       /* compute the device name */
+       strcpy(p, _PATH_DEV);
+       strncat(p, tty, UNAMESZ);
+
+       /* we must be careful when writing to the terminal. A terminal may block
+        * (for example, a user has pressed <ctl>-s). In that case, we can not
+        * wait indefinitely. So we need to use non-blocking I/O. In case we 
would
+        * block, we simply do not send the message, because that's the best we 
can
+        * do. -- rgerhards, 2008-07-04
+        */
+
+       /* open the terminal */
+       if((ttyf = open(p, O_WRONLY|O_NOCTTY|O_NONBLOCK)) >= 0) {
+         if(fstat(ttyf, &statb) == 0 && (statb.st_mode & S_IWRITE)) {
+           wrRet = write(ttyf, pMsg, strlen((char*)pMsg));
+           if(Debug && wrRet == -1) {
+             /* we record the state to the debug log */
+             errnoSave = errno;
+             rs_strerror_r(errno, (char*)szErr, sizeof(szErr));
+             dbgprintf("write to terminal '%s' failed with [%d]:%s\n",
+                       p, errnoSave, szErr);
+           }
+         }
+         close(ttyf);
+       }
+}
+
 /*  WALLMSG -- Write a message to the world at large
  *
  *     Write the specified message to either the entire
@@ -215,20 +256,78 @@ void endutent(void)
  */
 static rsRetVal wallmsg(uchar* pMsg, instanceData *pData)
 {
-
-       uchar szErr[512];
-       char p[sizeof(_PATH_DEV) + UNAMESZ];
        register int i;
-       int errnoSave;
-       int ttyf;
-       int wrRet;
        STRUCTUTMP ut;
        STRUCTUTMP *uptr;
-       struct stat statb;
        DEFiRet;
 
        assert(pMsg != NULL);
 
+#ifdef HAVE_LIBSYSTEMD
+       if (sd_booted() > 0) {
+               register int j;
+               int sdRet;
+               char **sessions_list;
+               int sessions = sd_get_sessions(&sessions_list);
+
+               for (j = 0; j < sessions; j++) {
+                       uchar szErr[512];
+                       char *user = NULL, *tty;
+                       uid_t uid;
+                       struct passwd *pws;
+
+                       sdRet = sd_session_get_uid(sessions_list[j], &uid);
+                       if (sdRet >= 0) {
+                               pws = getpwuid(uid);
+                               user = pws->pw_name;
+
+                               if (user == NULL) {
+                                       dbgprintf("failed to get username for 
userid '%d'\n", uid);
+                                       continue;
+                               }
+                       } else {
+                               /* we record the state to the debug log */
+                               rs_strerror_r(-sdRet, (char*)szErr, 
sizeof(szErr));
+                               dbgprintf("get userid for session '%s' failed 
with [%d]:%s\n",
+                                         sessions_list[j], -sdRet, szErr);
+                               continue; /* try next session */
+                       }
+                       /* should we send the message to this user? */
+                       if(pData->bIsWall == 0) {
+                               for(i = 0; i < MAXUNAMES; i++) {
+                                       if(!pData->uname[i][0]) {
+                                               i = MAXUNAMES;
+                                               break;
+                                       }
+                                       if(strncmp(pData->uname[i], user, 
UNAMESZ) == 0)
+                                               break;
+                               }
+                               if(i == MAXUNAMES) { /* user not found? */
+                                       free(user);
+                                       free(sessions_list[j]);
+                                       continue; /* on to next user! */
+                               }
+                       }
+                       if ((sdRet = sd_session_get_tty(sessions_list[j], 
&tty)) < 0) {
+                               /* we record the state to the debug log */
+                               rs_strerror_r(-sdRet, (char*)szErr, 
sizeof(szErr));
+                               dbgprintf("get tty for session '%s' failed with 
[%d]:%s\n",
+                                         sessions_list[j], -sdRet, szErr);
+                               free(user);
+                               free(sessions_list[j]);
+                               continue; /* try next session */
+                       }
+
+                       sendwallmsg(tty, pMsg);
+
+                       free(user);
+                       free(tty);
+                       free(sessions_list[j]);
+               }
+               free(sessions_list);
+       } else {
+#endif
+
        /* open the user login file */
        setutent();
 
@@ -259,35 +358,14 @@ static rsRetVal wallmsg(uchar* pMsg, instanceData *pData)
                                continue; /* on to next user! */
                }
 
-               /* compute the device name */
-               strcpy(p, _PATH_DEV);
-               strncat(p, ut.ut_line, UNAMESZ);
-
-               /* we must be careful when writing to the terminal. A terminal 
may block
-                * (for example, a user has pressed <ctl>-s). In that case, we 
can not
-                * wait indefinitely. So we need to use non-blocking I/O. In 
case we would
-                * block, we simply do not send the message, because that's the 
best we can
-                * do. -- rgerhards, 2008-07-04
-                */
-
-               /* open the terminal */
-               if((ttyf = open(p, O_WRONLY|O_NOCTTY|O_NONBLOCK)) >= 0) {
-                       if(fstat(ttyf, &statb) == 0 && (statb.st_mode & 
S_IWRITE)) {
-                               wrRet = write(ttyf, pMsg, strlen((char*)pMsg));
-                               if(Debug && wrRet == -1) {
-                                       /* we record the state to the debug log 
*/
-                                       errnoSave = errno;
-                                       rs_strerror_r(errno, (char*)szErr, 
sizeof(szErr));
-                                       dbgprintf("write to terminal '%s' 
failed with [%d]:%s\n",
-                                                 p, errnoSave, szErr);
-                               }
-                       }
-                       close(ttyf);
-               }
+               sendwallmsg(ut.ut_line, pMsg);
        }
 
        /* close the user login file */
        endutent();
+#ifdef HAVE_LIBSYSTEMD
+       }
+#endif
        RETiRet;
 }
 
-- 
2.42.0

Reply via email to