]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
lib/: Remove off-by-one bugs in calls to strncpy(3)
authorAlejandro Colomar <alx@kernel.org>
Wed, 15 Nov 2023 21:14:18 +0000 (22:14 +0100)
committerSerge Hallyn <serge@hallyn.com>
Sun, 26 Nov 2023 12:48:18 +0000 (06:48 -0600)
We're not even zeroing the last byte after this call.  This was a
completely gratuitous truncation of one byte, and the resulting
character array still wasn't guaranteed to be null terminated, because
strncpy(3) can't do that.

Just to clarify, none of these structures needed zeroing, as they are
treated as null-padded fixed-size character arrays.  Calling strncpy(3)
was actually the correct call, and the only problem was unnecessarily
truncating strings by one byte more than necessary.

Cc: Matthew House <mattlloydhouse@gmail.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
lib/log.c
lib/utmp.c

index 9457b1cd1ed6cbed1df4aff71b89091f807d9312..04aa3cfab6397228b1c582562ec2984aa63dad8b 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
@@ -82,7 +82,7 @@ void dolastlog (
        newlog.ll_time = ll_time;
        STRTCPY(newlog.ll_line, line);
 #if HAVE_LL_HOST
-       strncpy (newlog.ll_host, host, sizeof (newlog.ll_host) - 1);
+       strncpy(newlog.ll_host, host, sizeof(newlog.ll_host));
 #endif
        if (   (lseek (fd, offset, SEEK_SET) != offset)
            || (write_full(fd, &newlog, sizeof newlog) == -1)
index 906a9fac33231f189a26ecfaf46e72594578396a..0ec2692cc3851185c0d4187e44b0b44f5eaa4cc0 100644 (file)
@@ -262,25 +262,25 @@ static
        utent->ut_type = USER_PROCESS;
 #endif                         /* HAVE_STRUCT_UTMP_UT_TYPE */
        utent->ut_pid = getpid ();
-       strncpy (utent->ut_line, line,      sizeof (utent->ut_line) - 1);
+       strncpy(utent->ut_line, line, sizeof(utent->ut_line));
 #ifdef HAVE_STRUCT_UTMP_UT_ID
        if (NULL != ut) {
                strncpy (utent->ut_id, ut->ut_id, sizeof (utent->ut_id));
        } else {
                /* XXX - assumes /dev/tty?? */
-               strncpy (utent->ut_id, line + 3, sizeof (utent->ut_id) - 1);
+               strncpy(utent->ut_id, line + 3, sizeof(utent->ut_id));
        }
 #endif                         /* HAVE_STRUCT_UTMP_UT_ID */
 #ifdef HAVE_STRUCT_UTMP_UT_NAME
        strncpy (utent->ut_name, name,      sizeof (utent->ut_name));
 #endif                         /* HAVE_STRUCT_UTMP_UT_NAME */
 #ifdef HAVE_STRUCT_UTMP_UT_USER
-       strncpy (utent->ut_user, name,      sizeof (utent->ut_user) - 1);
+       strncpy(utent->ut_user, name, sizeof(utent->ut_user));
 #endif                         /* HAVE_STRUCT_UTMP_UT_USER */
        if (NULL != hostname) {
                struct addrinfo *info = NULL;
 #ifdef HAVE_STRUCT_UTMP_UT_HOST
-               strncpy (utent->ut_host, hostname, sizeof (utent->ut_host) - 1);
+               strncpy(utent->ut_host, hostname, sizeof(utent->ut_host));
 #endif                         /* HAVE_STRUCT_UTMP_UT_HOST */
 #ifdef HAVE_STRUCT_UTMP_UT_SYSLEN
                utent->ut_syslen = MIN (strlen (hostname),