src/passwd.c: Switch to day precision

The size of time_t varies across systems, but since data type long is
more than enough to calculate with days (precision of shadow file),
use it instead.

Just in case a shadow file contains huge values, check for a possible
signed integer overflow.

Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
Link: <https://github.com/shadow-maint/shadow/pull/876>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
This commit is contained in:
Tobias Stoeckmann
2024-01-05 15:41:12 -06:00
committed by Serge Hallyn
parent ecc3508877
commit 3b5ba41d3e
+4 -6
View File
@@ -343,7 +343,6 @@ static int new_password (const struct passwd *pw)
*/
static void check_password (const struct passwd *pw, const struct spwd *sp)
{
time_t now;
int exp_status;
exp_status = isexpired (pw, sp);
@@ -363,8 +362,6 @@ static void check_password (const struct passwd *pw, const struct spwd *sp)
return;
}
(void) time (&now);
/*
* Expired accounts cannot be changed ever. Passwords which are
* locked may not be changed. Passwords where min > max may not be
@@ -387,10 +384,11 @@ static void check_password (const struct passwd *pw, const struct spwd *sp)
* Passwords may only be changed after sp_min time is up.
*/
if (sp->sp_lstchg > 0) {
time_t ok;
ok = (time_t) sp->sp_lstchg * DAY;
long now, ok;
now = time(NULL) / DAY;
ok = sp->sp_lstchg;
if (sp->sp_min > 0) {
ok += (time_t) sp->sp_min * DAY;
ok += sp->sp_min;
}
if (now < ok) {