]> git.ipfire.org Git - thirdparty/shadow.git/log
thirdparty/shadow.git
19 months agolib/chkname.c: Use tmp variable to avoid a -Wsign-compare warning
Alejandro Colomar [Sat, 2 Sep 2023 12:15:43 +0000 (14:15 +0200)] 
lib/chkname.c: Use tmp variable to avoid a -Wsign-compare warning

I used size_t because:

sysconf(3) can return -1 if the value is not supported, but then it can
only mean that there's no limit.  Having no limit is the same as having
a limit of SIZE_MAX (to which -1 is converted).

Signed-off-by: Alejandro Colomar <alx@kernel.org>
19 months agoautogen.sh: CFLAGS: Add -Wextra
Alejandro Colomar [Sat, 2 Sep 2023 11:40:12 +0000 (13:40 +0200)] 
autogen.sh: CFLAGS: Add -Wextra

Signed-off-by: Alejandro Colomar <alx@kernel.org>
19 months agolib/string/: Fortify source of strtcpy(), stpecpy(), and zustr2stp()
Alejandro Colomar [Fri, 24 Nov 2023 22:56:17 +0000 (23:56 +0100)] 
lib/string/: Fortify source of strtcpy(), stpecpy(), and zustr2stp()

By writing the terminating null byte via stpcpy(3), we take advantage of
_FORTIFY_SOURCE for the last byte, which was unprotected before this
commit.

Reported-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
19 months agolib/env.c: Replace strncpy(3) call by stpcpy(mempcpy(), "")
Alejandro Colomar [Wed, 15 Nov 2023 21:49:13 +0000 (22:49 +0100)] 
lib/env.c: Replace strncpy(3) call by stpcpy(mempcpy(), "")

We were using strncpy(3), which is designed to copy from a string into a
(null-padded) fixed-size character array.  However, we were doing the
opposite: copying from a known-size array (which was a prefix of a
string), into a string.  That's why we had to manually zero the buffer
afterwards.

Use instead mempcpy(3) to copy the non-null bytes, and then terminate
with a null byte with stpcpy(..., "").

Cc: "Serge E. Hallyn" <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
19 months agolib/string/: Move string-related files to string/ subdir
Alejandro Colomar [Tue, 28 Nov 2023 01:48:37 +0000 (02:48 +0100)] 
lib/string/: Move string-related files to string/ subdir

Signed-off-by: Alejandro Colomar <alx@kernel.org>
19 months agoconfigure.ac: AM_INIT_AUTOMAKE: Use [subdir-objects]
Alejandro Colomar [Sat, 2 Dec 2023 20:55:02 +0000 (21:55 +0100)] 
configure.ac: AM_INIT_AUTOMAKE: Use [subdir-objects]

This will allow using subdirs.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/, src/: Say 'long' instead of 'long int'
Alejandro Colomar [Tue, 28 Nov 2023 01:05:45 +0000 (02:05 +0100)] 
lib/, src/: Say 'long' instead of 'long int'

We were using 'long' in most places, so be consistent and use it
everywhere.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/attr.h, lib/, src/: Move attributes to new header file
Alejandro Colomar [Tue, 28 Nov 2023 01:27:08 +0000 (02:27 +0100)] 
lib/attr.h, lib/, src/: Move attributes to new header file

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agosrc: add missing declaration of `getdef_bool`
Sergei Trofimovich [Fri, 1 Dec 2023 23:04:43 +0000 (23:04 +0000)] 
src: add missing declaration of `getdef_bool`

Upcoming `gcc-14` enabled a few warnings into errors, like
`-Wimplicit-function-declaration`. This caused `shadow` build to fail
as:

    pwunconv.c: In function 'main':
    pwunconv.c:132:13: error: implicit declaration of function 'getdef_bool' [-Wimplicit-function-declaration]
      132 |         if (getdef_bool("USE_TCB")) {
          |             ^~~~~~~~~~~

The change adds missing include headers.

20 months agolib/defines.h: Remove condition on __STRICT_ANSI__
Alejandro Colomar [Mon, 27 Nov 2023 23:12:28 +0000 (00:12 +0100)] 
lib/defines.h: Remove condition on __STRICT_ANSI__

We require C11 since a few releases ago.  It seems I missed this
reminder of ANSI C (C89) back then.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agotests/unit/test_chkname.c: Test is_valid_user_name()
Alejandro Colomar [Sun, 26 Nov 2023 22:21:44 +0000 (23:21 +0100)] 
tests/unit/test_chkname.c: Test is_valid_user_name()

Suggested-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agochsh: limit acceptable shells to absolute paths
Tobias Stoeckmann [Sat, 11 Nov 2023 22:10:55 +0000 (23:10 +0100)] 
chsh: limit acceptable shells to absolute paths

If an entry in /etc/shells is not an absolute path (comments or
partial reads due to fgets), the line should not be considered as
a valid login shell.

In general all systems should have getusershells, but let's better
be safe than sorry.

Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
20 months agolib/: Use NITEMS() instead of SIZEOF_ARRAY() where number of elements is meant
Alejandro Colomar [Thu, 23 Nov 2023 00:06:52 +0000 (01:06 +0100)] 
lib/: Use NITEMS() instead of SIZEOF_ARRAY() where number of elements is meant

For arrays of char, both NITEMS() and SIZEOF_ARRAY() return the same
value.  However, NITEMS() is more appropriate.  Think of wide-character
equivalents of the same code; with NITEMS(), they would continue to be
valid, while with SIZEOF_ARRAY(), they would be wrong.

In the implementation of ZUSTR2STP(), we want SIZEOF_ARRAY() within the
static assert, because we're just comparing the sizes of the source and
destination buffers, and we don't care if we compare sizes or numbers of
elements, and using sizes is just simpler.  But we want NITEMS() in the
zustr2stp() call, where we want to copy a specific number of characters.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/chkname.c: Update regex for valid names
Alejandro Colomar [Mon, 13 Nov 2023 12:33:37 +0000 (13:33 +0100)] 
lib/chkname.c: Update regex for valid names

The maximum length of 32 wasn't being enforced in the code, and POSIX
doesn't specify that maximum length either, so it seems it was an
arbitrary limit of the past that doesn't exist any more.  Use a regex
that has no length limit.

Closes: <https://github.com/shadow-maint/shadow/issues/836>
Link: <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agotests/unit/test_strncpy.c: Test STRNCPY()
Alejandro Colomar [Thu, 16 Nov 2023 10:42:26 +0000 (11:42 +0100)] 
tests/unit/test_strncpy.c: Test STRNCPY()

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/: Use STRNCPY() instead of strncpy(3)
Alejandro Colomar [Wed, 15 Nov 2023 21:36:19 +0000 (22:36 +0100)] 
lib/: Use STRNCPY() instead of strncpy(3)

We've recently fixed several bugs in the calculation of the size in this
function call.  Use this wrapper to prevent similar mistakes in the
future.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/strncpy.h: Add STRNCPY() wrapper for strncpy(3)
Alejandro Colomar [Wed, 15 Nov 2023 21:31:02 +0000 (22:31 +0100)] 
lib/strncpy.h: Add STRNCPY() wrapper for strncpy(3)

This wrapper calculates the destination buffer's size, to avoid errors
in the size calculation.

A curious fact: this macro did exist in Version 7 Unix (with a slightly
different name).  I found it by chance, investigating the origins of
strncpy(3) and strncat(3) in V7, after Branden suggested me to do so,
related to recent discussions about string_copying(7).

alx@debian:~/src/unix/unix/Research-V7$ grepc SCPYN .
./usr/src/cmd/login.c:#define SCPYN(a, b) strncpy(a, b, sizeof(a))

Our implementation is slightly better, because using nitems() we're
protected against passing a pointer instead of an array, and it's also
conceptually more appropriate: for wide characters, it would be

#define WCSNCPY(dst, src)  wcsncpy(dst, src, NITEMS(dst))

Cc: "G. Branden Robinson" <branden@debian.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/: Remove off-by-one bugs in calls to strncpy(3)
Alejandro Colomar [Wed, 15 Nov 2023 21:14:18 +0000 (22:14 +0100)] 
lib/: Remove off-by-one bugs in calls to strncpy(3)

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>
20 months agolib/log.c: Replace strncpy(3) call by STRTCPY()
Alejandro Colomar [Wed, 15 Nov 2023 23:08:47 +0000 (00:08 +0100)] 
lib/log.c: Replace strncpy(3) call by STRTCPY()

This call was too clever.  It relied on the last byte of ll_line
being 0 due to a previous memzero() and not writing to it later.
Write an explicit terminating null byte, by using STRTCPY().

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/failure.c: Replace strncpy(3) call by STRTCPY()
Alejandro Colomar [Wed, 15 Nov 2023 22:58:23 +0000 (23:58 +0100)] 
lib/failure.c: Replace strncpy(3) call by STRTCPY()

This call was way too clever.  It relied on the last byte of fail_line
being 0 due to it being in a static structure and never writing to it.
Write an explicit terminating null byte, by using STRTCPY().

Cc: Matthew House <mattlloydhouse@gmail.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/utmp.c: Replace strncpy(3) call by ZUSTR2STP()
Alejandro Colomar [Tue, 7 Nov 2023 17:03:08 +0000 (18:03 +0100)] 
lib/utmp.c: Replace strncpy(3) call by ZUSTR2STP()

We were copying from a (zero-padded) fixed-width character array to a
string, but strncpy(3) is meant to do the opposite thing.  ZUSTR2STP()
is designed to be used in this case (like strncat(3)).

Fixes: f40bdfa66a3a ("libmisc: implement `get_session_host()`")
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agotests/: Remove references to cracklib
Alejandro Colomar [Mon, 30 Oct 2023 12:36:04 +0000 (13:36 +0100)] 
tests/: Remove references to cracklib

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agoRemove libcrack support
Alejandro Colomar [Mon, 30 Oct 2023 12:31:42 +0000 (13:31 +0100)] 
Remove libcrack support

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agoRemove FascistHistory() and FascistHistoryPw() calls
Alejandro Colomar [Mon, 30 Oct 2023 11:53:37 +0000 (12:53 +0100)] 
Remove FascistHistory() and FascistHistoryPw() calls

These functions don't seem to exist anymore.  I can't find them in
Debian, nor in a web search.  They probably were functions from an
ancient implementation of cracklib that doesn't exist anymore.

$ git remote -v
origin git@github.com:cracklib/cracklib.git (fetch)
origin git@github.com:cracklib/cracklib.git (push)
$ grep -rni fascisthistory
$ git log --grep FascistHistory
$ git log -S FascistHistory

Closes: <https://codesearch.debian.net/search?q=FascistHistory&literal=1>
Cc: Mike Frysinger <vapier@gentoo.org>
Acked-by: Michael Vetter <jubalh@iodoru.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/date_to_str.c: strftime(3) leaves the buffer undefined on failure
Alejandro Colomar [Thu, 16 Nov 2023 14:56:25 +0000 (15:56 +0100)] 
lib/date_to_str.c: strftime(3) leaves the buffer undefined on failure

strftime(3) makes no guarantees about the contents of the buffer if the
formatted string wouldn't fit in the buffer.  It simply returns 0, and
it's the programmer's responsibility to do the right thing after that.

Let's write the string "future" if there's an error, similar to what we
do with gmtime(3)'s errors.

Also, `buf[size - 1] = '\0';` didn't make sense.  If the copy fits,
strftime(3) guarantees to terminate with NUL.  If it doesn't, the entire
contents of buf are undefined, so adding a NUL at the end of the buffer
would be dangerous: the string could contain anything, such as
"gimme root access now".  Remove that, now that we set the string to
"future", as with gmtime(3) errors.  This setting to '\0' comes from the
times when we used strncpy(3) in the implementation, and should have
been removed when I changed it to use strlcpy(3); however, I didn't
check we didn't need it anymore.

Cc: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agosrc/logoutd.c: Fix theoretical buffer overrun
Alejandro Colomar [Wed, 15 Nov 2023 23:26:23 +0000 (00:26 +0100)] 
src/logoutd.c: Fix theoretical buffer overrun

ut_line doesn't hold a string.  It is a null-padded fixed-width array.
Luckily, I don't think there has ever existed a ut_line ("/dev/tty*")
that was 32 bytes long.  That would have resulted in a buffer overrun.
Anyway, do the right thing, which is copying into a temporary string.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/date_to_str.c, configure.ac: Replace calls to strlcpy(3) by strtcpy(3)
Alejandro Colomar [Sun, 12 Nov 2023 13:10:57 +0000 (14:10 +0100)] 
lib/date_to_str.c, configure.ac: Replace calls to strlcpy(3) by strtcpy(3)

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/date_to_str.c: Add missing include <config.h>
Alejandro Colomar [Sun, 12 Nov 2023 22:20:15 +0000 (23:20 +0100)] 
lib/date_to_str.c: Add missing include <config.h>

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/Makefile.am: Add missing source file
Alejandro Colomar [Sun, 12 Nov 2023 13:10:07 +0000 (14:10 +0100)] 
lib/Makefile.am: Add missing source file

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agosrc/, lib/, tests/: Rename files defining strtcpy()
Alejandro Colomar [Sun, 12 Nov 2023 13:08:42 +0000 (14:08 +0100)] 
src/, lib/, tests/: Rename files defining strtcpy()

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agosrc/, lib/, tests/: Rename STRLCPY() to STRTCPY()
Alejandro Colomar [Sun, 12 Nov 2023 13:00:47 +0000 (14:00 +0100)] 
src/, lib/, tests/: Rename STRLCPY() to STRTCPY()

It is a wrapper around STRTCPY(), so use a proper name.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/strlcpy.[ch]: Implement strtcpy(3) to replace strlcpy_()
Alejandro Colomar [Sun, 12 Nov 2023 12:43:32 +0000 (13:43 +0100)] 
lib/strlcpy.[ch]: Implement strtcpy(3) to replace strlcpy_()

There's been a very long and interesting discussion in linux-man@ and
libc-alpha@, where we've discussed all the string-copying functions,
their pros and cons, when should each be used and avoided, etc.

Paul Eggert pointed out an important problem of strlcpy(3): it is
vulnerable to DoS attacks if an attacker controls the length of the
source string.  And even if it doesn't control it, the function is dead
slow (because its API forces it to calculate strlen(src)).

We've agreed that the general solution for a truncating string-copying
function is to write a wrapper over strnlen(3)+memcpy(3), which is
limited to strnlen(src, sizeof(dst)).  This is not vulnerable to DoS,
and is very fast for all buffer sizes.  string_copying(7) has been
updated to reflect this, and provides a reference implementation for
this wrapper function.

This strtcpy(3) (t for truncation) wrapper happens to have the same API
that our strlcpy_() function had, so replace it with the better
implementation.  We don't need to update callers nor tests, since the
API is the same.

A future commit will rename STRLCPY() to STRTCPY(), and replace
remaining calls to strlcpy(3) by calls to this strtcpy(3).

Link: <https://lore.kernel.org/linux-man/ZU4SDh-Se5gjPny5@debian/T/#mfb5a3fdeb35487dec6f8d9e3d8548bd0d92c4975/>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agolib/strlcpy.[ch]: Fix return type
Alejandro Colomar [Sat, 2 Sep 2023 12:21:49 +0000 (14:21 +0200)] 
lib/strlcpy.[ch]: Fix return type

To return an error code, we need ssize_t.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agotests/unit/test_strlcpy.c: Test strlcpy_() and STRLCPY()
Alejandro Colomar [Fri, 20 Oct 2023 12:58:29 +0000 (14:58 +0200)] 
tests/unit/test_strlcpy.c: Test strlcpy_() and STRLCPY()

This test fails now, due to a bug: the return type of strlcpy_() is
size_t, but it should be ssize_t.  The next commit will pass the test,
by fixing the bug.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agoREADME.md, STABLE.md: record the stable branch URL(s).
Alejandro Colomar [Wed, 27 Sep 2023 16:45:51 +0000 (11:45 -0500)] 
README.md, STABLE.md: record the stable branch URL(s).

Acked-by: Serge Hallyn <serge@hallyn.com>
Acked-by: Iker Pedrosa <ipedrosa@redhat.com>
Cc: Sam James <sam@gentoo.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
20 months agoDefine SUBUID_FILE/SUBGID_FILE
Joakim Tjernlund [Wed, 1 Nov 2023 23:00:03 +0000 (00:00 +0100)] 
Define SUBUID_FILE/SUBGID_FILE

These where hard coded, make them definable like SHADOW_FILE

Signed-off-by: Joakim Tjernlund <joakim.tjernlund@infinera.com>
20 months agoCI: fix Fedora 39 build
Iker Pedrosa [Mon, 13 Nov 2023 08:53:10 +0000 (09:53 +0100)] 
CI: fix Fedora 39 build

libbsd is unwanted in Fedora and RHEL, and the recently released Fedora
39 doesn't contain this dependency in the base image.

shadow removed libbsd from its dependencies for Fedora 39, so let's
build without it to avoid compilation errors.

Resolves: https://github.com/shadow-maint/shadow/issues/839

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
Reviewed-by: Alejandro Colomar <alx@kernel.org>
21 months agolib/utmp.c: Don't check for NULL before free(3)
Alejandro Colomar [Sun, 29 Oct 2023 18:46:02 +0000 (19:46 +0100)] 
lib/utmp.c: Don't check for NULL before free(3)

free(NULL) is valid; there's no need to check for NULL.  Simplify.

Fixes: 5178f8c5afb6 ("utmp: call prepare_utmp() even if utent is NULL")
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agoAdd keys/ directory with public keys for maintainers 825/head
Serge Hallyn [Thu, 26 Oct 2023 21:40:50 +0000 (16:40 -0500)] 
Add keys/ directory with public keys for maintainers

These can be used to verify releases.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
21 months agoman: document --prefix option in chage, chpasswd and passwd
Michael Vetter [Fri, 20 Oct 2023 13:22:35 +0000 (15:22 +0200)] 
man: document --prefix option in chage, chpasswd and passwd

Support for `--prefix` was added in
https://github.com/shadow-maint/shadow/pull/714 and is available since
shadow 4.14.0.

Close https://github.com/shadow-maint/shadow/issues/822

21 months agolibmisc/copydir: do not forget errors from directory copy
Christian Göttsche [Thu, 26 Jan 2023 20:37:30 +0000 (21:37 +0100)] 
libmisc/copydir: do not forget errors from directory copy

    copydir.c:429:4: warning: Value stored to 'err' is never read [deadcode.DeadStores]

Also reduce indentation by bailing out early.

(cherry picked from commit d89f2fb06d1b81b56299f9d0bfe7a927a2282f19)

21 months agoImprove the login.defs unknown item error message
Serge Hallyn [Wed, 4 Oct 2023 15:38:48 +0000 (10:38 -0500)] 
Improve the login.defs unknown item error message

Closes #746

Only print the 'unknown item' message to syslog if we are
actually parsing a login.defs.  Prefix it with "shadow:" to make
it clear in syslog where it came from.

Also add the source filename to the console message.  I'm not
quite clear on the econf API, so not sure whether in that path we
will end up actually having the path, or printing ''.

Signed-off-by: Serge Hallyn <serge@hallyn.com>
21 months agoautogen.sh: Prepare CFLAGS before ./configure
Alejandro Colomar [Sat, 2 Sep 2023 15:31:15 +0000 (17:31 +0200)] 
autogen.sh: Prepare CFLAGS before ./configure

Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agolib/: Add missing #include <config.h>
Alejandro Colomar [Fri, 1 Sep 2023 17:03:05 +0000 (19:03 +0200)] 
lib/: Add missing #include <config.h>

Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agoautogen.sh: CFLAGS: Add -Werror=implicit-function-declaration
Alejandro Colomar [Fri, 1 Sep 2023 16:57:41 +0000 (18:57 +0200)] 
autogen.sh: CFLAGS: Add -Werror=implicit-function-declaration

This is not just a style issue.  This should be a hard error, and never
compile.  ISO C89 already had this feature as deprecated.  ISO C99
removed this deprecated feature, for good reasons.  If we compile
ignoring this warning, shadow is not going to behave well.

Cc: Sam James <sam@gentoo.org>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agolib/, src/: Use xasprintf() instead of its pattern
Alejandro Colomar [Sat, 2 Sep 2023 16:29:26 +0000 (18:29 +0200)] 
lib/, src/: Use xasprintf() instead of its pattern

Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agolib/, src/: Use asprintf(3) instead of strlen(3)+malloc(3)+snprintf(3)
Alejandro Colomar [Fri, 25 Aug 2023 19:27:05 +0000 (21:27 +0200)] 
lib/, src/: Use asprintf(3) instead of strlen(3)+malloc(3)+snprintf(3)

asprintf(3) is non-standard, but is provided by GNU, the BSDs, and musl.
That makes it portable enough for us to use.

This function is much simpler than the burdensome code for allocating
the right size.  Being simpler, it's thus safer.

I took the opportunity to fix the style to my preferred one in the
definitions of variables used in these calls, and also in the calls to
free(3) with these pointers.  That isn't gratuituous, but has a reason:
it makes those appear in the diff for this patch, which helps review it.
Oh, well, I had an excuse :)

Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agolib/copydir.c: Use goto to reduce a conditional branch
Alejandro Colomar [Wed, 4 Oct 2023 16:46:48 +0000 (18:46 +0200)] 
lib/copydir.c: Use goto to reduce a conditional branch

Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agotests/unit/test_xasprintf.c: Test x[v]asprintf()
Alejandro Colomar [Fri, 6 Oct 2023 15:44:21 +0000 (17:44 +0200)] 
tests/unit/test_xasprintf.c: Test x[v]asprintf()

Link: <https://github.com/shadow-maint/shadow/pull/816>
Suggested-by: Iker Pedrosa <ipedrosa@redhat.com>
Acked-by: Andreas Schneider <https://github.com/cryptomilk>
Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agolib/sprintf.[ch]: Add x[v]asprintf()
Alejandro Colomar [Fri, 25 Aug 2023 23:27:12 +0000 (01:27 +0200)] 
lib/sprintf.[ch]: Add x[v]asprintf()

As other x...() wrappers around functions that allocate, these wrappers
are like [v]asprintf(3), but exit on failure.

Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agolib/copydir.c: Invert conditional to reduce nesting
Alejandro Colomar [Fri, 25 Aug 2023 20:23:24 +0000 (22:23 +0200)] 
lib/copydir.c: Invert conditional to reduce nesting

Reviewed-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
21 months agoFix badname option to be singular just like useradd.
Dimitri John Ledkov [Fri, 13 Oct 2023 00:44:11 +0000 (01:44 +0100)] 
Fix badname option to be singular just like useradd.

Badnames still accepted, note that previously usage already stated
singular form, whilst manpage and real one was plural only.

Fixes: 45d6746219 ("src: correct "badname" option")
Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
21 months agoFix mixed-whitespace
Dimitri John Ledkov [Fri, 13 Oct 2023 00:43:00 +0000 (01:43 +0100)] 
Fix mixed-whitespace

Signed-off-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
21 months agoRemove TODO
Iker Pedrosa [Tue, 5 Sep 2023 14:13:44 +0000 (16:13 +0200)] 
Remove TODO

Sad to remove this file, but things are going on and it doesn't seem to
be up to date.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agoRemove shadow.spec.in
Iker Pedrosa [Tue, 5 Sep 2023 14:11:08 +0000 (16:11 +0200)] 
Remove shadow.spec.in

The file isn't up to date with the latest development, the last change
was made 15 years ago, so I'm removing it.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agoRemove .travis.yml
Iker Pedrosa [Mon, 4 Sep 2023 14:44:42 +0000 (16:44 +0200)] 
Remove .travis.yml

It isn't used anywhere so let's remove it.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agodoc: remove WISHLIST
Iker Pedrosa [Fri, 1 Sep 2023 14:18:31 +0000 (16:18 +0200)] 
doc: remove WISHLIST

Another file that I remove with sadness. We were unable to complete the
first item but we are working hard on it.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agodoc: remove README.platforms
Iker Pedrosa [Fri, 1 Sep 2023 14:11:06 +0000 (16:11 +0200)] 
doc: remove README.platforms

I remove this file with sadness, as it contains data from old times.
Unfortunately, this data is no longer relevant. The source code
management tool will keep it in memory.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agodoc: remove cracklib26.diff
Iker Pedrosa [Fri, 1 Sep 2023 14:04:44 +0000 (16:04 +0200)] 
doc: remove cracklib26.diff

Keeping a patch for a file no longer maintained is a bad idea, so I'm
removing it.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agodoc: remove console.c.spec.txt
Iker Pedrosa [Fri, 1 Sep 2023 14:01:16 +0000 (16:01 +0200)] 
doc: remove console.c.spec.txt

I guess we are keeping this for historical purposes more than anything
else. If so, anybody can check the git history to recover the
specification.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agocontrib: remove udbachk.tgz
Iker Pedrosa [Fri, 1 Sep 2023 13:58:50 +0000 (15:58 +0200)] 
contrib: remove udbachk.tgz

Having source code in a compressed file doesn't seem like a good idea. I
checked several distributions and they don't distribute this binary, so
let's remove it.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agocontrib: remove shadow-anonftp.patch
Iker Pedrosa [Fri, 1 Sep 2023 13:47:25 +0000 (15:47 +0200)] 
contrib: remove shadow-anonftp.patch

The patch is never applied upstream. If I were to take a gamble, I would
even say that it throws an error when trying to patch.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agocontrib: remove groupmems.shar
Iker Pedrosa [Fri, 1 Sep 2023 13:40:17 +0000 (15:40 +0200)] 
contrib: remove groupmems.shar

Not sure what this file is exactly, but there's already a groupmems.c
that should generate the binary responsible for managing  the members of
a user's primary group.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agocontrib: remove atudel
Iker Pedrosa [Thu, 31 Aug 2023 14:30:02 +0000 (16:30 +0200)] 
contrib: remove atudel

AFAIK, it isn't included in any distribution and it isn't used
internally in the project, so let's remove it.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
21 months agoCI: remove .builds folder
Iker Pedrosa [Thu, 31 Aug 2023 14:20:54 +0000 (16:20 +0200)] 
CI: remove .builds folder

We stopped using the CI relying on this folder and moved to Github's, so
I'm removing these files.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
22 months agouseradd: Set proper SELinux labels for def_usrtemplate
Johannes Segitz [Tue, 26 Sep 2023 13:14:14 +0000 (15:14 +0200)] 
useradd: Set proper SELinux labels for def_usrtemplate

Fixes: 74c17c716 ("Add support for skeleton files from /usr/etc/skel")
Signed-off-by: Johannes Segitz <jsegitz@suse.com>
22 months agodoc: add unit tests
Iker Pedrosa [Fri, 15 Sep 2023 07:24:41 +0000 (09:24 +0200)] 
doc: add unit tests

Brief description of the unit testing framework and how to create test
cases with it.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
22 months agoCI: build and run unit tests
Iker Pedrosa [Thu, 14 Sep 2023 12:41:23 +0000 (14:41 +0200)] 
CI: build and run unit tests

Run `make check` after the project is built in every runner.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
22 months agotests: happy path for active_sessions_count()
Iker Pedrosa [Thu, 14 Sep 2023 10:47:04 +0000 (12:47 +0200)] 
tests: happy path for active_sessions_count()

Simple test to check the recently implemented logind functionality. It
also contains the changes to the build infrastructure, and the
gitignore.

Resolves: https://github.com/shadow-maint/shadow/issues/790

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
22 months agoconfigure: add cmocka for unit tests
Iker Pedrosa [Thu, 14 Sep 2023 10:13:21 +0000 (12:13 +0200)] 
configure: add cmocka for unit tests

Prepare the ground for unit tests.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
22 months agofaillog: check for overflows
Christian Göttsche [Tue, 28 Feb 2023 16:24:22 +0000 (17:24 +0100)] 
faillog: check for overflows

Check for arithmetic overflows when computing offsets to avoid file
corruptions for huge UIDs.

Refactor the file lookup into a separate function.

22 months agoutmp: call prepare_utmp() even if utent is NULL
Iker Pedrosa [Fri, 15 Sep 2023 07:55:02 +0000 (09:55 +0200)] 
utmp: call prepare_utmp() even if utent is NULL

update_utmp() should also return 0 when success.

Fixes: 1f368e1c1838de9d476a36897d7c53394569de08 ("utmp: update
`update_utmp()")
Resolves: https://github.com/shadow-maint/shadow/issues/805

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
22 months agogroupadd: Improve error message when opening group file fails.
Vasil Velichkov [Fri, 1 Sep 2023 22:29:07 +0000 (01:29 +0300)] 
groupadd: Improve error message when opening group file fails.

Both gr_open and sgr_open are using commonio_open function and when
there is a failure this function sets errno accordingly.

22 months agolib/mempcpy.[ch]: Remove our definition of mempcpy(3)
Alejandro Colomar [Sat, 2 Sep 2023 16:14:19 +0000 (18:14 +0200)] 
lib/mempcpy.[ch]: Remove our definition of mempcpy(3)

It is provided by glibc, musl, and FreeBSD.

Reported-by: Sam James <sam@gentoo.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
22 months agolib/pwauth.c: Replace getpass(3) by agetpass()
Alejandro Colomar [Fri, 1 Sep 2023 23:58:05 +0000 (01:58 +0200)] 
lib/pwauth.c: Replace getpass(3) by agetpass()

Closes: <https://github.com/shadow-maint/shadow/issues/797>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
22 months agolib/agetpass.h: Move prototypes to dedicated header
Alejandro Colomar [Sat, 2 Sep 2023 00:17:26 +0000 (02:17 +0200)] 
lib/agetpass.h: Move prototypes to dedicated header

Signed-off-by: Alejandro Colomar <alx@kernel.org>
22 months agolib/pwauth.c: Simplify empty string
Alejandro Colomar [Fri, 1 Sep 2023 23:49:00 +0000 (01:49 +0200)] 
lib/pwauth.c: Simplify empty string

And do not set 'clear' to point to the empty string.  After this commit,
'clear' only stores the result of getpass(3).  This will be useful to
change the code to use agetpass().

$ grep '\<clear\>' lib/pwauth.c;
char *clear = NULL;
clear = getpass (prompt);
input = (clear == NULL) ? "" : clear;
clear = getpass (prompt);
input = (clear == NULL) ? "" : clear;
if (NULL != clear) {
strzero (clear);

Signed-off-by: Alejandro Colomar <alx@kernel.org>
22 months agolib/pwauth.c: Remove dead code
Alejandro Colomar [Fri, 1 Sep 2023 22:58:15 +0000 (00:58 +0200)] 
lib/pwauth.c: Remove dead code

There are no users of 'clear_pass' and 'wipe_clear_pass'.

$ grep -rn '\<clear_pass\>'
lib/pwauth.c:35:/*@null@*/char *clear_pass = NULL;
lib/pwauth.c:199:  * not wipe it (the caller should wipe clear_pass when it is
lib/pwauth.c:203: clear_pass = clear;

$ grep -rn wipe_clear_pass
lib/pwauth.c:34:bool wipe_clear_pass = true;
lib/pwauth.c:198:  * if the external variable wipe_clear_pass is zero, we will
lib/pwauth.c:204: if (wipe_clear_pass && (NULL != clear) && ('\0' != *clear)) {
ChangeLog:3813: * lib/pwauth.c: Use a boolean for wipe_clear_pass and use_skey.

Remove them.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
22 months agolib/pwauth.c: Remove dead code
Alejandro Colomar [Fri, 1 Sep 2023 22:54:16 +0000 (00:54 +0200)] 
lib/pwauth.c: Remove dead code

If the string is "", then strzero() is a no-op.  We don't need to test
that.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
22 months agoautogen.sh: Support out-of-tree builds
Alejandro Colomar [Sat, 2 Sep 2023 12:01:58 +0000 (14:01 +0200)] 
autogen.sh: Support out-of-tree builds

This allows to do the following:

~/src/shadow/shadow/master$ mkdir .tmp/ && cd .tmp/
~/src/shadow/shadow/master/.tmp$ ../autogen.sh

Link: <https://github.com/shadow-maint/shadow/issues/795>
Reviewed-by: Sam James <sam@gentoo.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agozustr2stp.h: Assert some assumptions about the size
Alejandro Colomar [Thu, 31 Aug 2023 13:36:20 +0000 (15:36 +0200)] 
zustr2stp.h: Assert some assumptions about the size

If the destination buffer is an array, we can check our assumptions.
This adds a readable way to explain that dsize must be strictly > ssize.
The reason is that the destination string is the source + '\0'.

If the destination is not an array, it's up to _FORTIFY_SOURCE or
-fanalyzer to catch newly introduced errors.  There's nothing we can do;
at least not portably.

Suggested-by: Serge Hallyn <serge@hallyn.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agostrlcpy.[ch]: Add strlcpy_()
Alejandro Colomar [Sat, 26 Aug 2023 13:28:24 +0000 (15:28 +0200)] 
strlcpy.[ch]: Add strlcpy_()

This function is like strlcpy(3), but returns -1 on truncation, which
makes it much easier to test.  strlcpy(3) is useful in two cases:

-  We don't care if the output is truncated.  strlcpy(3) is fine for
   those, and the return value can be ignored.

-  Truncation is bad.  In that case, we just want to signal truncation,
   and the length of the original string is quite useless.  Return the
   length iff no truncation so that we can use it if necessary.

This simplifies the definition of the STRLCPY() macro.

Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agoUse bzero(3) instead of its pattern
Alejandro Colomar [Tue, 1 Aug 2023 16:27:50 +0000 (18:27 +0200)] 
Use bzero(3) instead of its pattern

It was blessed by POSIX.1-2001, and GCC says that it won't go away,
possibly ever.

memset(3) is dangerous, as the 2nd and 3rd arguments can be accidentally
swapped --who remembers what's the order of the 2nd and 3rd parameters
to memset(3) without checking the manual page or some code that uses
it?--.  Some recent compilers may be able to catch that via some
warnings, but those are not infalible.  And even if compiler warnings
could always catch that, the time lost in fixing or checking the docs is
lost for no clear gain.  Having a sane API that is unambiguous is the
Right Thing (tm); and that API is bzero(3).

If someone doesn't believe memset(3) is error-prone, please read the
book "Unix Network Programming", Volume 1, 3rd Edition by Stevens, et
al., Section 1.2.  See a stackoverflow reference in the link below[1].

bzero(3) had a bad fame in the bad old days, because some ancient
systems (I'm talking of many decades ago) shipped a broken version of
bzero(3).  We can assume that all systems in which current shadow utils
can be built, have a working version of bzero(3) --if not, please fix
your broken system; don't blame the programmer--.

One reason that some use today to avoid bzero(3) in favor of memset(3)
is that memset(3) is more often used; but that's a circular reasoning.
Even if bzero(3) wasn't supported by the system, it would need to be
invented.  It's the right API.

Another reason that some argue is that POSIX.1-2008 removed the
specification of bzero(3).  That's not a problem, because GCC will
probably support it forever, and even if it didn't, we can redefine it
like we do with memzero().  bzero(3) is just a one-liner wrapper around
memset(3).

Link: [1] <https://stackoverflow.com/a/17097978>
Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agoUse CALLOC() instead of its pattern
Alejandro Colomar [Mon, 31 Jul 2023 15:30:59 +0000 (17:30 +0200)] 
Use CALLOC() instead of its pattern

MALLOC() + memset() is simpler written as CALLOC().

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agoUse STRLCPY() instead of its pattern
Alejandro Colomar [Sat, 29 Jul 2023 16:22:12 +0000 (18:22 +0200)] 
Use STRLCPY() instead of its pattern

This makes it harder to make mistakes while editing the code.  Since the
sizeof's can be autocalculated, let the machine do that.  It also
reduces the cognitive load while reading the code.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agodefines.h: Remove definition of STRFCPY()
Alejandro Colomar [Sat, 29 Jul 2023 16:13:06 +0000 (18:13 +0200)] 
defines.h: Remove definition of STRFCPY()

It's not being used anymore.  We got rid of it in favor of better APIs.

Well, it's still being used in one place: a contrib/ patch, but I
explicitly want to break it, so that someone reviews it.  I don't want
to modify it, since it's not being tested, so it would be very risky for
me to touch it.  Instead, let it bitrot, and if someone cares, they'll
update it correctly.

BTW, the comment that said /* danger -side effects */ was wrong:
sizeof() doesn't evaluate the argument (unless it's a VLA), so there
wasn't really a double-evaluation issue.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agopasswd: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Sat, 29 Jul 2023 16:11:02 +0000 (18:11 +0200)] 
passwd: Replace STRFCPY() by STRLCPY()

The variables are only being read as strings (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agogpasswd: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Sat, 29 Jul 2023 16:04:30 +0000 (18:04 +0200)] 
gpasswd: Replace STRFCPY() by STRLCPY()

The variable is only being read as a string (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agologin: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Sat, 29 Jul 2023 15:56:46 +0000 (17:56 +0200)] 
login: Replace STRFCPY() by STRLCPY()

The variable is only being read as a string (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agosu: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Sat, 29 Jul 2023 15:35:40 +0000 (17:35 +0200)] 
su: Replace STRFCPY() by STRLCPY()

The variables are only being read as strings (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agosulogin: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Sat, 29 Jul 2023 15:28:23 +0000 (17:28 +0200)] 
sulogin: Replace STRFCPY() by STRLCPY()

The variable is only being read as a string (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agochsh: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Thu, 8 Jun 2023 18:46:09 +0000 (20:46 +0200)] 
chsh: Replace STRFCPY() by STRLCPY()

The variables are only being read as strings (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agochfn: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Thu, 8 Jun 2023 18:39:04 +0000 (20:39 +0200)] 
chfn: Replace STRFCPY() by STRLCPY()

The variables are only being read as strings (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agochage: Replace STRFCPY() by STRLCPY()
Alejandro Colomar [Thu, 8 Jun 2023 18:33:13 +0000 (20:33 +0200)] 
chage: Replace STRFCPY() by STRLCPY()

The variables are only being read as strings (char *), so data after the
'\0' can't be leaked.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agostrlcpy.h: Add STRLCPY() macro
Alejandro Colomar [Sat, 29 Jul 2023 15:21:24 +0000 (17:21 +0200)] 
strlcpy.h: Add STRLCPY() macro

It wraps strlcpy(3bsd) so that it performs some steps that one might
forget, or might be prone to accidents:

-  It calculates the size of the destination buffer, and makes sure it's
   an array (otherwise, using sizeof(dst) would be very bad).

-  It calculates if there's truncation, returning an easy-to-use value.

BTW, this macro doesn't have any issues of double evaluation, because
sizeof() doesn't evaluate its argument (unless it's a VLA, but then
the static_assert(3) within SIZEOF_ARRAY() makes sure VLAs are not
allowed).

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agoUse ZUSTR2STP() instead of its pattern
Alejandro Colomar [Sun, 30 Jul 2023 16:48:36 +0000 (18:48 +0200)] 
Use ZUSTR2STP() instead of its pattern

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agozustr2stp.h: Add ZUSTR2STP() macro
Alejandro Colomar [Sun, 30 Jul 2023 16:45:47 +0000 (18:45 +0200)] 
zustr2stp.h: Add ZUSTR2STP() macro

It's a wrapper around zustr2stp() that calls SIZEOF_ARRAY() internally.
The function call is usually --in our code base, always-- called with an
array as the second argument.  For such an argument, one should call
SIZEOF_ARRAY().  To avoid mistakes, and simplify usage, let's add this
macro that does it internally.

BTW, this macro doesn't have any issues of double evaluation, because
sizeof() doesn't evaluate its argument (unless it's a VLA, but then
the static_assert(3) within SIZEOF_ARRAY() makes sure VLAs are not
allowed).

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agoCall zustr2stp() where appropriate
Alejandro Colomar [Sun, 30 Jul 2023 16:07:35 +0000 (18:07 +0200)] 
Call zustr2stp() where appropriate

These calls were intending to copy from a NUL-padded (possibly
non-NUL-terminated) character sequences contained in fixed-width arrays,
into a string, where extra padding is superfluous.  Use the appropriate
call, which removes the superfluous work.  That reduces the chance of
confusing maintainers about the intention of the code.

While at it, use the appropriate third parameter, which is the size of
the source buffer, and not the one of the destination buffer.  As a side
effect, this reduces the use of '-1', which itself reduces the chance of
off-by-one bugs.

Also, since using sizeof() on an array is dangerous, use SIZEOF_ARRAY().

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agozustr2stp.[ch]: Add zustr2stp()
Alejandro Colomar [Sun, 30 Jul 2023 15:39:59 +0000 (17:39 +0200)] 
zustr2stp.[ch]: Add zustr2stp()

There's no standard function that copies from a null-padded character
sequence into a string.

A few standard functions can be workarounded to do that:

-  strncat(3):  This function is designed to catenate from a null-padded
   character sequence into a string.  The catch is that there's no
   *cpy() equivalent of it --strncpy(3) is not at all related to
   strncat(3); don't be fooled by the confusing name--, so one would
   need to zero the first byte before the call to strncat(3).  It also
   has the inconvenient that it returns a useless value.

-  strncpy(3):  This function is designed to copy from a string to a
   null-padded character sequence; the opposite of what we want to do.
   If one passes the size of src instead of the size of dst, and then
   manually zeroes the last byte of the dst buffer, something similar
   to what we want happens.  However, this does more than what we want:
   it also padds with NUL the remaining bytes after the terminating NUL.
   That extra work can confuse maintainers to believe that it's
   necessary.  That is exactly what happens in logout.c.

src/logoutd.c-46- /*
src/logoutd.c-47-  * ut_user may not have the terminating NUL.
src/logoutd.c-48-  */
src/logoutd.c:49: strncpy (user, ut->ut_user, sizeof (ut->ut_user));
src/logoutd.c-50- user[sizeof (ut->ut_user)] = '\0';

   In that logout.c case --and in most invocations of strncpy(3), which
   is usually a wrong tool-- the extra work is not wanted, so it's
   preferrable to use the right tool, a function that does exactly
   what's needed and nothing more than that.  That tool is zustr2stp().

Read string_copying(7) for a more complete comparison of string copying
functions.

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
23 months agolibmisc: Fix wrong #include
Alejandro Colomar [Sun, 30 Jul 2023 15:55:20 +0000 (17:55 +0200)] 
libmisc: Fix wrong #include

Cc: Christian Göttsche <cgzones@googlemail.com>
Cc: Serge Hallyn <serge@hallyn.com>
Cc: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>