]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
Disable utmpx permanently
authorAlejandro Colomar <alx@kernel.org>
Wed, 21 Dec 2022 17:33:40 +0000 (18:33 +0100)
committerIker Pedrosa <ikerpedrosam@gmail.com>
Thu, 22 Dec 2022 09:31:43 +0000 (10:31 +0100)
On Linux, utmpx and utmp are identical.  However, documentation (manual
pages) covers utmp, and just says about utmpx that it's identical to
utmp.  It seems that it's preferred to use utmp, at least by reading the
manual pages.

Moreover, we were defaulting to utmp (utmpx had to be explicitly enabled
at configuration time).  So, it seems safer to just make it permanent,
which should not affect default builds.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
configure.ac
lib/prototypes.h
libmisc/failure.c
libmisc/failure.h
libmisc/limits.c
libmisc/user_busy.c
libmisc/utmp.c
src/login.c
src/logoutd.c

index 9d176d0b74a17a1a695f70be7236ec33e82a0944..c7dbadd5f9d8e00fb482198eb5de7523ed23273e 100644 (file)
@@ -228,17 +228,6 @@ AC_ARG_ENABLE(account-tools-setuid,
        [enable_acct_tools_setuid="no"]
 )
 
-AC_ARG_ENABLE(utmpx,
-       [AS_HELP_STRING([--enable-utmpx],
-                       [enable loggin in utmpx / wtmpx @<:@default=no@:>@])],
-       [case "${enableval}" in
-        yes) enable_utmpx="yes" ;;
-         no) enable_utmpx="no" ;;
-          *) AC_MSG_ERROR(bad value ${enableval} for --enable-utmpx) ;;
-        esac],
-       [enable_utmpx="no"]
-)
-
 AC_ARG_ENABLE(subordinate-ids,
        [AS_HELP_STRING([--enable-subordinate-ids],
                [support subordinate ids @<:@default=yes@:>@])],
@@ -697,12 +686,6 @@ if test "$with_skey" = "yes"; then
        ]])],[AC_DEFINE(SKEY_BSD_STYLE, 1, [Define to support newer BSD S/Key API])],[])
 fi
 
-if test "$enable_utmpx" = "yes"; then
-       AC_DEFINE(USE_UTMPX,
-                 1,
-                 [Define if utmpx should be used])
-fi
-
 AC_DEFINE_UNQUOTED(SHELL, ["$SHELL"], [The default shell.])
 
 AM_GNU_GETTEXT_VERSION([0.19])
index 885c7391cca932d2e5cb195696b824c76823369f..d2314dcd6fe2a10b2f1f611b406d8c670ba1e2e4 100644 (file)
 #include <config.h>
 
 #include <sys/stat.h>
-#ifdef USE_UTMPX
-#include <utmpx.h>
-#else
 #include <utmp.h>
-#endif
 #include <sys/types.h>
 #include <pwd.h>
 #include <grp.h>
@@ -466,21 +462,12 @@ extern int set_filesize_limit (int blocks);
 extern int user_busy (const char *name, uid_t uid);
 
 /* utmp.c */
-#ifndef USE_UTMPX
 extern /*@null@*/struct utmp *get_current_utmp (void);
 extern struct utmp *prepare_utmp (const char *name,
                                   const char *line,
                                   const char *host,
                                   /*@null@*/const struct utmp *ut);
 extern int setutmp (struct utmp *ut);
-#else
-extern /*@null@*/struct utmpx *get_current_utmp (void);
-extern struct utmpx *prepare_utmpx (const char *name,
-                                    const char *line,
-                                    const char *host,
-                                    /*@null@*/const struct utmpx *ut);
-extern int setutmpx (struct utmpx *utx);
-#endif                         /* USE_UTMPX */
 
 /* valid.c */
 extern bool valid (const char *, const struct passwd *);
index 1aab299cc63fea610b5b26b3868b47b235d7cf80..fb4bcde39f4aee8b97af582da8bcacc7d9899822 100644 (file)
@@ -243,11 +243,7 @@ void failprint (const struct faillog *fail)
  */
 
 void failtmp (const char *username,
-#ifdef USE_UTMPX
-                    const struct utmpx *failent
-#else                          /* !USE_UTMPX */
                     const struct utmp *failent
-#endif                         /* !USE_UTMPX */
     )
 {
        const char *ftmp;
index 2ac30d7f44e20cfd2619e1653a91cb5bf27ec35e..374e54cc061d5d5a8378fb05446e687c72b3dc32 100644 (file)
 
 #include "defines.h"
 #include "faillog.h"
-#ifdef USE_UTMPX
-#include <utmpx.h>
-#else                                  /* !USE_UTMPX */
 #include <utmp.h>
-#endif                                 /* !USE_UTMPX */
 
 /*
  * failure - make failure entry
@@ -51,11 +47,7 @@ extern void failprint (const struct faillog *);
  *     failtmp updates the (struct utmp) formatted failure log which
  *     maintains a record of all login failures.
  */
-#ifdef USE_UTMPX
-extern void failtmp (const char *username, const struct utmpx *);
-#else                          /* !USE_UTMPX */
 extern void failtmp (const char *username, const struct utmp *);
-#endif                         /* !USE_UTMPX */
 
 #endif
 
index 99518679e9d4cdd121befe65a3864adcdf0f4226..cf0e30aed6d7989f6a58a4b3b3eafcf75d81981d 100644 (file)
@@ -119,11 +119,7 @@ static int set_umask (const char *value)
 /* Counts the number of user logins and check against the limit */
 static int check_logins (const char *name, const char *maxlogins)
 {
-#ifdef USE_UTMPX
-       struct utmpx *ut;
-#else                          /* !USE_UTMPX */
        struct utmp *ut;
-#endif                         /* !USE_UTMPX */
        unsigned long limit, count;
 
        if (getulong (maxlogins, &limit) == 0) {
@@ -136,13 +132,8 @@ static int check_logins (const char *name, const char *maxlogins)
        }
 
        count = 0;
-#ifdef USE_UTMPX
-       setutxent ();
-       while ((ut = getutxent ()))
-#else                          /* !USE_UTMPX */
        setutent ();
        while ((ut = getutent ()))
-#endif                         /* !USE_UTMPX */
        {
                if (USER_PROCESS != ut->ut_type) {
                        continue;
@@ -158,11 +149,7 @@ static int check_logins (const char *name, const char *maxlogins)
                        break;
                }
        }
-#ifdef USE_UTMPX
-       endutxent ();
-#else                          /* !USE_UTMPX */
        endutent ();
-#endif                         /* !USE_UTMPX */
        /*
         * This is called after setutmp(), so the number of logins counted
         * includes the user who is currently trying to log in.
index c03feb2903e832bc8bc5d6e913d6114251dd5886..1a4ea3411af054fb7f5367045ec892d38f4d563e 100644 (file)
@@ -52,17 +52,10 @@ int user_busy (const char *name, uid_t uid)
 #ifndef __linux__
 static int user_busy_utmp (const char *name)
 {
-#ifdef USE_UTMPX
-       struct utmpx *utent;
-
-       setutxent ();
-       while ((utent = getutxent ()) != NULL)
-#else                          /* !USE_UTMPX */
        struct utmp *utent;
 
        setutent ();
        while ((utent = getutent ()) != NULL)
-#endif                         /* !USE_UTMPX */
        {
                if (utent->ut_type != USER_PROCESS) {
                        continue;
index 45b479f118c24e6a25a83af6584b4083ca0fba31..6662bbe9b3e594f2a1b81cc1a9bce726ae7662c0 100644 (file)
 #include "defines.h"
 #include "prototypes.h"
 
-#ifdef USE_UTMPX
-#include <utmpx.h>
-#else
 #include <utmp.h>
-#endif
-
 #include <assert.h>
 #include <sys/param.h>
 #include <sys/types.h>
@@ -75,7 +70,6 @@ static bool is_my_tty (const char *tty)
  *
  *     Return NULL if no entries exist in utmp for the current process.
  */
-#ifndef USE_UTMPX
 /*@null@*/ /*@only@*/struct utmp *get_current_utmp (void)
 {
        struct utmp *ut;
@@ -109,35 +103,6 @@ static bool is_my_tty (const char *tty)
 
        return ret;
 }
-#else
-/*@null@*/ /*@only*/struct utmpx *get_current_utmp(void)
-{
-       struct utmpx *ut;
-       struct utmpx *ret = NULL;
-
-       setutxent ();
-
-       /* Find the utmpx entry for this PID. */
-       while ((ut = getutxent ()) != NULL) {
-               if (   (ut->ut_pid == getpid ())
-                   && ('\0' != ut->ut_id[0])
-                   && (   (LOGIN_PROCESS == ut->ut_type)
-                       || (USER_PROCESS == ut->ut_type))
-                   && is_my_tty (ut->ut_line)) {
-                       break;
-               }
-       }
-
-       if (NULL != ut) {
-               ret = (struct utmpx *) xmalloc (sizeof (*ret));
-               memcpy (ret, ut, sizeof (*ret));
-       }
-
-       endutxent ();
-
-       return ret;
-}
-#endif
 
 
 #ifndef USE_PAM
@@ -158,24 +123,9 @@ static void updwtmp (const char *filename, const struct utmp *ut)
 }
 #endif                         /* ! HAVE_UPDWTMP */
 
-#ifdef USE_UTMPX
-#ifndef HAVE_UPDWTMPX
-static void updwtmpx (const char *filename, const struct utmpx *utx)
-{
-       int fd;
-
-       fd = open (filename, O_APPEND | O_WRONLY, 0);
-       if (fd >= 0) {
-               write (fd, (const char *) utx, sizeof (*utx));
-               close (fd);
-       }
-}
-#endif                         /* ! HAVE_UPDWTMPX */
-#endif                         /* ! USE_UTMPX */
 #endif                         /* ! USE_PAM */
 
 
-#ifndef USE_UTMPX
 /*
  * prepare_utmp - prepare an utmp entry so that it can be logged in a
  *                utmp/wtmp file.
@@ -334,141 +284,3 @@ int setutmp (struct utmp *ut)
 
        return err;
 }
-
-#else
-/*
- * prepare_utmpx - the UTMPX version for prepare_utmp
- */
-/*@only@*/struct utmpx *prepare_utmpx (const char *name,
-                                       const char *line,
-                                       const char *host,
-                                       /*@null@*/const struct utmpx *ut)
-{
-       struct timeval tv;
-       char *hostname = NULL;
-       struct utmpx *utxent;
-
-       assert (NULL != name);
-       assert (NULL != line);
-
-
-
-       if (   (NULL != host)
-           && ('\0' != host[0])) {
-               hostname = (char *) xmalloc (strlen (host) + 1);
-               strcpy (hostname, host);
-#ifdef HAVE_STRUCT_UTMP_UT_HOST
-       } else if (   (NULL != ut)
-                  && (NULL != ut->ut_host)
-                  && ('\0' != ut->ut_host[0])) {
-               hostname = (char *) xmalloc (sizeof (ut->ut_host) + 1);
-               strncpy (hostname, ut->ut_host, sizeof (ut->ut_host));
-               hostname[sizeof (ut->ut_host)] = '\0';
-#endif                         /* HAVE_STRUCT_UTMP_UT_TYPE */
-       }
-
-       if (strncmp(line, "/dev/", 5) == 0) {
-               line += 5;
-       }
-
-       utxent = (struct utmpx *) xmalloc (sizeof (*utxent));
-       memzero (utxent, sizeof (*utxent));
-
-
-
-       utxent->ut_type = USER_PROCESS;
-       utxent->ut_pid = getpid ();
-       strncpy (utxent->ut_line, line,      sizeof (utxent->ut_line));
-       /* existence of ut->ut_id is enforced by configure */
-       if (NULL != ut) {
-               strncpy (utxent->ut_id, ut->ut_id, sizeof (utxent->ut_id));
-       } else {
-               /* XXX - assumes /dev/tty?? */
-               strncpy (utxent->ut_id, line + 3, sizeof (utxent->ut_id));
-       }
-#ifdef HAVE_STRUCT_UTMPX_UT_NAME
-       strncpy (utxent->ut_name, name,      sizeof (utxent->ut_name));
-#endif                         /* HAVE_STRUCT_UTMPX_UT_NAME */
-       strncpy (utxent->ut_user, name,      sizeof (utxent->ut_user));
-       if (NULL != hostname) {
-               struct addrinfo *info = NULL;
-#ifdef HAVE_STRUCT_UTMPX_UT_HOST
-               strncpy (utxent->ut_host, hostname, sizeof (utxent->ut_host));
-#endif                         /* HAVE_STRUCT_UTMPX_UT_HOST */
-#ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN
-               utxent->ut_syslen = MIN (strlen (hostname),
-                                        sizeof (utxent->ut_host));
-#endif                         /* HAVE_STRUCT_UTMPX_UT_SYSLEN */
-#if defined(HAVE_STRUCT_UTMPX_UT_ADDR) || defined(HAVE_STRUCT_UTMPX_UT_ADDR_V6)
-               if (getaddrinfo (hostname, NULL, NULL, &info) == 0) {
-                       /* getaddrinfo might not be reliable.
-                        * Just try to log what may be useful.
-                        */
-                       if (info->ai_family == AF_INET) {
-                               struct sockaddr_in *sa =
-                                       (struct sockaddr_in *) info->ai_addr;
-#ifdef HAVE_STRUCT_UTMPX_UT_ADDR
-                               memcpy (&utxent->ut_addr,
-                                       &(sa->sin_addr),
-                                       MIN (sizeof (utxent->ut_addr),
-                                            sizeof (sa->sin_addr)));
-#endif                         /* HAVE_STRUCT_UTMPX_UT_ADDR */
-#ifdef HAVE_STRUCT_UTMPX_UT_ADDR_V6
-                               memcpy (utxent->ut_addr_v6,
-                                       &(sa->sin_addr),
-                                       MIN (sizeof (utxent->ut_addr_v6),
-                                            sizeof (sa->sin_addr)));
-                       } else if (info->ai_family == AF_INET6) {
-                               struct sockaddr_in6 *sa =
-                                       (struct sockaddr_in6 *) info->ai_addr;
-                               memcpy (utxent->ut_addr_v6,
-                                       &(sa->sin6_addr),
-                                       MIN (sizeof (utxent->ut_addr_v6),
-                                            sizeof (sa->sin6_addr)));
-#endif                         /* HAVE_STRUCT_UTMPX_UT_ADDR_V6 */
-                       }
-                       freeaddrinfo (info);
-               }
-#endif         /* HAVE_STRUCT_UTMPX_UT_ADDR || HAVE_STRUCT_UTMPX_UT_ADDR_V6 */
-               free (hostname);
-       }
-       /* ut_exit is only for DEAD_PROCESS */
-       utxent->ut_session = getsid (0);
-       if (gettimeofday (&tv, NULL) == 0) {
-#ifdef HAVE_STRUCT_UTMPX_UT_TIME
-               utxent->ut_time = tv.tv_sec;
-#endif                         /* HAVE_STRUCT_UTMPX_UT_TIME */
-#ifdef HAVE_STRUCT_UTMPX_UT_XTIME
-               utxent->ut_xtime = tv.tv_usec;
-#endif                         /* HAVE_STRUCT_UTMPX_UT_XTIME */
-               utxent->ut_tv.tv_sec  = tv.tv_sec;
-               utxent->ut_tv.tv_usec = tv.tv_usec;
-       }
-
-       return utxent;
-}
-
-/*
- * setutmpx - the UTMPX version for setutmp
- */
-int setutmpx (struct utmpx *utx)
-{
-       int err = 0;
-
-       assert (NULL != utx);
-
-       setutxent ();
-       if (pututxline (utx) == NULL) {
-               err = 1;
-       }
-       endutxent ();
-
-#ifndef USE_PAM
-       /* This is done by pam_lastlog */
-       updwtmpx (_WTMP_FILE "x", utx);
-#endif                         /* ! USE_PAM */
-
-       return err;
-}
-#endif                         /* USE_UTMPX */
-
index 00482816180bbed642e31758a89f90aff0f31ad1..eb1b20c9f0c471244fe5e3b3308818de9bfb5751 100644 (file)
@@ -107,11 +107,7 @@ static /*@observer@*/const char *get_failent_user (/*@returned@*/const char *use
 static void update_utmp (const char *user,
                          const char *tty,
                          const char *host,
-#ifdef USE_UTMPX
-                         /*@null@*/const struct utmpx *utent
-#else
                          /*@null@*/const struct utmp *utent
-#endif
                        );
 
 #ifndef USE_PAM
@@ -462,26 +458,13 @@ static /*@observer@*/const char *get_failent_user (/*@returned@*/const char *use
 static void update_utmp (const char *user,
                          const char *tty,
                          const char *host,
-#ifdef USE_UTMPX
-                         /*@null@*/const struct utmpx *utent
-#else
                          /*@null@*/const struct utmp *utent
-#endif
                         )
 {
-#ifdef USE_UTMPX
-       struct utmpx *utx = prepare_utmpx (user, tty, host, utent);
-#else
        struct utmp  *ut  = prepare_utmp  (user, tty, host, utent);
-#endif                         /* USE_UTMPX */
 
-#ifndef USE_UTMPX
        (void) setutmp  (ut);   /* make entry in the utmp & wtmp files */
        free (ut);
-#else
-       (void) setutmpx (utx);  /* make entry in the utmpx & wtmpx files */
-       free (utx);
-#endif                         /* USE_UTMPX */
 }
 
 /*
@@ -526,11 +509,7 @@ int main (int argc, char **argv)
        struct passwd *pwd = NULL;
        char **envp = environ;
        const char *failent_user;
-#ifdef USE_UTMPX
-       /*@null@*/struct utmpx *utent;
-#else
        /*@null@*/struct utmp *utent;
-#endif
 
 #ifdef USE_PAM
        int retcode;
@@ -674,7 +653,7 @@ int main (int argc, char **argv)
 
        if (rflg || hflg) {
                cp = hostname;
-#if defined(HAVE_STRUCT_UTMP_UT_HOST) || defined(USE_UTMPX)
+#if defined(HAVE_STRUCT_UTMP_UT_HOST)
        } else if ((NULL != utent) && ('\0' != utent->ut_host[0])) {
                cp = utent->ut_host;
 #endif                         /* HAVE_STRUCT_UTMP_UT_HOST */
@@ -1036,19 +1015,11 @@ int main (int argc, char **argv)
                        failure (pwd->pw_uid, tty, &faillog);
                }
                if (getdef_str ("FTMP_FILE") != NULL) {
-#ifdef USE_UTMPX
-                       struct utmpx *failent =
-                               prepare_utmpx (failent_user,
-                                              tty,
-                       /* FIXME: or fromhost? */hostname,
-                                              utent);
-#else                          /* !USE_UTMPX */
                        struct utmp *failent =
                                prepare_utmp (failent_user,
                                              tty,
                                              hostname,
                                              utent);
-#endif                         /* !USE_UTMPX */
                        failtmp (failent_user, failent);
                        free (failent);
                }
index 03680f3f3979d898592248e60c11892ce22528db..76b93086d9d110a722e2521dfab3ce0944c5f852 100644 (file)
@@ -32,21 +32,13 @@ const char *Prog;
 #endif
 
 /* local function prototypes */
-#ifdef USE_UTMPX
-static int check_login (const struct utmpx *ut);
-#else                          /* !USE_UTMPX */
 static int check_login (const struct utmp *ut);
-#endif                         /* !USE_UTMPX */
 static void send_mesg_to_tty (int tty_fd);
 
 /*
- * check_login - check if user (struct utmpx/utmp) allowed to stay logged in
+ * check_login - check if user (struct utmp) allowed to stay logged in
  */
-#ifdef USE_UTMPX
-static int check_login (const struct utmpx *ut)
-#else                          /* !USE_UTMPX */
 static int check_login (const struct utmp *ut)
-#endif                         /* !USE_UTMPX */
 {
        char user[sizeof (ut->ut_user) + 1];
        time_t now;
@@ -116,7 +108,7 @@ static void send_mesg_to_tty (int tty_fd)
  *
  *     logoutd is started at system boot time and enforces the login
  *     time and port restrictions specified in /etc/porttime. The
- *     utmpx/utmp file is periodically scanned and offending users are logged
+ *     utmp file is periodically scanned and offending users are logged
  *     off from the system.
  */
 int main (int argc, char **argv)
@@ -125,11 +117,7 @@ int main (int argc, char **argv)
        int status;
        pid_t pid;
 
-#ifdef USE_UTMPX
-       struct utmpx *ut;
-#else                          /* !USE_UTMPX */
        struct utmp *ut;
-#endif                         /* !USE_UTMPX */
        char user[sizeof (ut->ut_user) + 1];    /* terminating NUL */
        char tty_name[sizeof (ut->ut_line) + 6];        /* /dev/ + NUL */
        int tty_fd;
@@ -171,31 +159,23 @@ int main (int argc, char **argv)
        OPENLOG ("logoutd");
 
        /*
-        * Scan the utmpx/utmp file once per minute looking for users that
+        * Scan the utmp file once per minute looking for users that
         * are not supposed to still be logged in.
         */
        while (true) {
 
                /*
-                * Attempt to re-open the utmpx/utmp file. The file is only
+                * Attempt to re-open the utmp file. The file is only
                 * open while it is being used.
                 */
-#ifdef USE_UTMPX
-               setutxent ();
-#else                          /* !USE_UTMPX */
                setutent ();
-#endif                         /* !USE_UTMPX */
 
                /*
-                * Read all of the entries in the utmpx/utmp file. The entries
+                * Read all of the entries in the utmp file. The entries
                 * for login sessions will be checked to see if the user
                 * is permitted to be signed on at this time.
                 */
-#ifdef USE_UTMPX
-               while ((ut = getutxent ()) != NULL)
-#else                          /* !USE_UTMPX */
                while ((ut = getutent ()) != NULL)
-#endif                         /* !USE_UTMPX */
                {
                        if (ut->ut_type != USER_PROCESS) {
                                continue;
@@ -259,11 +239,7 @@ int main (int argc, char **argv)
                        exit (EXIT_SUCCESS);
                }
 
-#ifdef USE_UTMPX
-               endutxent ();
-#else                          /* !USE_UTMPX */
                endutent ();
-#endif                         /* !USE_UTMPX */
 
 #ifndef DEBUG
                sleep (60);