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:
committed by
Serge Hallyn
parent
ecc3508877
commit
3b5ba41d3e
+4
-6
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user