From 4b646f01600a5efcf16e8e8991010b49b250bdfe Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 13 Feb 2023 16:22:23 +0100 Subject: [PATCH] last: use full size of the username utmp uses 32 bytes for username, last(1) truncates it to 31 when calls getpwnam(). Reported-by: Radka Skvarilova Signed-off-by: Karel Zak --- login-utils/last.1.adoc | 2 ++ login-utils/last.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/login-utils/last.1.adoc b/login-utils/last.1.adoc index 1157ae9571..04d407387f 100644 --- a/login-utils/last.1.adoc +++ b/login-utils/last.1.adoc @@ -117,6 +117,8 @@ The files _wtmp_ and _btmp_ might not be found. The system only logs information An empty entry is a valid type of wtmp entry. It means that an empty file or file with zeros is not interpreted as an error. +The utmp file format uses fixed sizes of strings, which means that very long strings are impossible to store in the file and impossible to display by last. The usual limits are 32 bytes for a user and line name and 256 bytes for a hostname. + == AUTHORS mailto:miquels@cistron.nl[Miquel van Smoorenburg] diff --git a/login-utils/last.c b/login-utils/last.c index 260a9f35e8..d3eeed4b6e 100644 --- a/login-utils/last.c +++ b/login-utils/last.c @@ -602,12 +602,14 @@ static int is_phantom(const struct last_control *ctl, struct utmpx *ut) { struct passwd *pw; char path[sizeof(ut->ut_line) + 16]; + char user[sizeof(ut->ut_user) + 1]; int ret = 0; if (ut->ut_tv.tv_sec < ctl->boot_time.tv_sec) return 1; - ut->ut_user[sizeof(ut->ut_user) - 1] = '\0'; - pw = getpwnam(ut->ut_user); + + mem2strcpy(user, ut->ut_user, sizeof(ut->ut_user), sizeof(user)); + pw = getpwnam(user); if (!pw) return 1; snprintf(path, sizeof(path), "/proc/%u/loginuid", ut->ut_pid); -- 2.47.2