From 00ced4001b769e6f0c9c1dab7d43802bb6be36d4 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Sun, 11 Apr 2021 12:29:29 +0000 Subject: Add WTMP_FILE; make getutx*() stay on found record --- src/include/utmps/utmpx.h | 3 ++- src/utmps/utmps-utmpd.c | 26 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/include/utmps/utmpx.h b/src/include/utmps/utmpx.h index dd68945..f0414fb 100644 --- a/src/include/utmps/utmpx.h +++ b/src/include/utmps/utmpx.h @@ -67,8 +67,9 @@ extern void logwtmp (char const *, char const *, char const *) ; #define UT_NAMESIZE UTMPS_UT_NAMESIZE #define UT_HOSTSIZE UTMPS_UT_HOSTSIZE -/* Unused, but some packages (ex: procps-ng) require this macro to be present */ +/* Unused, but some packages (ex: procps-ng) require these macros to be present */ #define UTMPX_FILE "/run/utmps/utmp" +#define WTMPX_FILE "/run/utmps/wtmp" /* More old GNU/crap compatibility */ #define ut_name ut_user diff --git a/src/utmps/utmps-utmpd.c b/src/utmps/utmps-utmpd.c index 17f4cab..af77a06 100644 --- a/src/utmps/utmps-utmpd.c +++ b/src/utmps/utmps-utmpd.c @@ -104,6 +104,11 @@ static int idmatch (unsigned short type, char const *id, struct utmpx const *b) return 0 ; } +static inline int onestepback (void) +{ + return lseek(fd, -(off_t)sizeof(struct utmpx), SEEK_CUR) >= 0 ; +} + static void do_getent (void) { struct utmpx b ; @@ -116,6 +121,12 @@ static void do_getent (void) answer(ESRCH) ; return ; } + if (!onestepback()) + { + unlockit() ; + answer(errno) ; + return ; + } unlockit() ; utmps_utmpx_unpack(buf+1, &b) ; utmps_utmpx_pack(buf+1, &b) ; @@ -145,11 +156,18 @@ static void do_getid (void) utmps_utmpx_unpack(sbuf+1, &b) ; if (idmatch(type, rbuf + USHORT_PACK, &b)) break ; } + if (!onestepback()) + { + unlockit() ; + answer(errno) ; + return ; + } unlockit() ; buffer_putnoflush(buffer_1small, sbuf, 1 + sizeof(struct utmpx)) ; flush1() ; } + static void do_getline (void) { char rbuf[UTMPS_UT_LINESIZE] ; @@ -171,6 +189,12 @@ static void do_getline (void) if ((b.ut_type == LOGIN_PROCESS || b.ut_type == USER_PROCESS) && !strncmp(rbuf, b.ut_line, UTMPS_UT_LINESIZE - 1)) break ; } + if (!onestepback()) + { + unlockit() ; + answer(errno) ; + return ; + } unlockit() ; buffer_putnoflush(buffer_1small, sbuf, 1 + sizeof(struct utmpx)) ; flush1() ; @@ -197,7 +221,7 @@ static void do_putline (uid_t uid, gid_t gid) utmps_utmpx_unpack(tmp, &b) ; if (idmatch(u.ut_type, u.ut_id, &b) && !strncmp(u.ut_line, b.ut_line, UTMPS_UT_LINESIZE - 1)) { - if (lseek(fd, -(off_t)sizeof(struct utmpx), SEEK_CUR) < 0) + if (!onestepback()) { unlockit() ; answer(errno) ; -- cgit v1.2.3