From 80359410c4056ffa9113837cebac8bdfde3f3ac2 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Wed, 18 Apr 2018 18:32:21 +0200 Subject: [PATCH] sysusers: make sure to reset the returned value when EOF is reached in fget*ent_sane() wrappers (#8737) To indicate that the there're no more entries, these wrappers return false but did leave the passed pointed unmodified. However EOF is not an error and is a very common case so initialize the output argument to NULL even in this case so callers don't need to do that. Fixes: #8721 --- src/basic/user-util.c | 28 ++++++------------- test/TEST-21-SYSUSERS/test-12.expected-group | 2 ++ test/TEST-21-SYSUSERS/test-12.expected-passwd | 2 ++ test/TEST-21-SYSUSERS/test-12.initial-group | 1 + test/TEST-21-SYSUSERS/test-12.initial-passwd | 1 + test/TEST-21-SYSUSERS/test-12.input | 1 + 6 files changed, 15 insertions(+), 20 deletions(-) create mode 100644 test/TEST-21-SYSUSERS/test-12.expected-group create mode 100644 test/TEST-21-SYSUSERS/test-12.expected-passwd create mode 100644 test/TEST-21-SYSUSERS/test-12.initial-group create mode 100644 test/TEST-21-SYSUSERS/test-12.initial-passwd create mode 100644 test/TEST-21-SYSUSERS/test-12.input diff --git a/src/basic/user-util.c b/src/basic/user-util.c index 1effd55b023..0f0f21dbcf3 100644 --- a/src/basic/user-util.c +++ b/src/basic/user-util.c @@ -775,14 +775,11 @@ int fgetpwent_sane(FILE *stream, struct passwd **pw) { errno = 0; p = fgetpwent(stream); - if (p == NULL) { - if (errno == ENOENT) - return false; + if (p == NULL && errno != ENOENT) return errno > 0 ? -errno : -EIO; - } *pw = p; - return true; + return p != NULL; } int fgetspent_sane(FILE *stream, struct spwd **sp) { @@ -793,14 +790,11 @@ int fgetspent_sane(FILE *stream, struct spwd **sp) { errno = 0; s = fgetspent(stream); - if (s == NULL) { - if (errno == ENOENT) - return false; + if (s == NULL && errno != ENOENT) return errno > 0 ? -errno : -EIO; - } *sp = s; - return true; + return s != NULL; } int fgetgrent_sane(FILE *stream, struct group **gr) { @@ -811,14 +805,11 @@ int fgetgrent_sane(FILE *stream, struct group **gr) { errno = 0; g = fgetgrent(stream); - if (g == NULL) { - if (errno == ENOENT) - return false; + if (g == NULL && errno != ENOENT) return errno > 0 ? -errno : -EIO; - } *gr = g; - return true; + return g != NULL; } #if ENABLE_GSHADOW @@ -830,13 +821,10 @@ int fgetsgent_sane(FILE *stream, struct sgrp **sg) { errno = 0; s = fgetsgent(stream); - if (s == NULL) { - if (errno == ENOENT) - return false; + if (s == NULL && errno != ENOENT) return errno > 0 ? -errno : -EIO; - } *sg = s; - return true; + return s != NULL; } #endif diff --git a/test/TEST-21-SYSUSERS/test-12.expected-group b/test/TEST-21-SYSUSERS/test-12.expected-group new file mode 100644 index 00000000000..5d94846ed1b --- /dev/null +++ b/test/TEST-21-SYSUSERS/test-12.expected-group @@ -0,0 +1,2 @@ +root:x:0: +systemd-coredump:x:1: diff --git a/test/TEST-21-SYSUSERS/test-12.expected-passwd b/test/TEST-21-SYSUSERS/test-12.expected-passwd new file mode 100644 index 00000000000..75fe9b420df --- /dev/null +++ b/test/TEST-21-SYSUSERS/test-12.expected-passwd @@ -0,0 +1,2 @@ +root:x:0:0:root:/root:/bin/bash +systemd-coredump:x:1:1:systemd Core Dumper:/:/sbin/nologin diff --git a/test/TEST-21-SYSUSERS/test-12.initial-group b/test/TEST-21-SYSUSERS/test-12.initial-group new file mode 100644 index 00000000000..1dbf9013eeb --- /dev/null +++ b/test/TEST-21-SYSUSERS/test-12.initial-group @@ -0,0 +1 @@ +root:x:0: diff --git a/test/TEST-21-SYSUSERS/test-12.initial-passwd b/test/TEST-21-SYSUSERS/test-12.initial-passwd new file mode 100644 index 00000000000..aebc4923f4a --- /dev/null +++ b/test/TEST-21-SYSUSERS/test-12.initial-passwd @@ -0,0 +1 @@ +root:x:0:0:root:/root:/bin/bash diff --git a/test/TEST-21-SYSUSERS/test-12.input b/test/TEST-21-SYSUSERS/test-12.input new file mode 100644 index 00000000000..2913120276d --- /dev/null +++ b/test/TEST-21-SYSUSERS/test-12.input @@ -0,0 +1 @@ +u systemd-coredump 1 "systemd Core Dumper"