From: Karel Zak Date: Mon, 13 Feb 2023 15:22:23 +0000 (+0100) Subject: last: use full size of the username X-Git-Tag: v2.39-rc1~79 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4b646f01600a5efcf16e8e8991010b49b250bdfe;p=thirdparty%2Futil-linux.git 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 --- 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);