diff options
author | Alejandro Colomar <alx@kernel.org> | 2024-02-20 22:47:41 +0100 |
---|---|---|
committer | Alejandro Colomar <alx@kernel.org> | 2024-02-20 22:48:02 +0100 |
commit | 2128715ede4334ac05fa9783b24b091eb371bd4c (patch) | |
tree | 31b22fed22bc3c5d61088c5a2f74d8442ce9408d | |
parent | fee5e61d05534f5450d87e964f598c11e5c7dd13 (diff) |
Revert 3 cherry-picks
This changes pull some more dependencies. That's too much for a stable
branch, I think. If anyone needs them, please ask for them, but for now
let's keep them out.
Reverts: 9d5591fba90f ("src/passwd.c: check password length upper limit")
Reverts: dbdda2a48a77 ("lib/: Saturate addition to avoid overflow")
Reverts: 541d4dde23e8 ("src/chage.c: Unify long overflow checks in print_day_as_date()")
Signed-off-by: Alejandro Colomar <alx@kernel.org>
-rw-r--r-- | lib/age.c | 12 | ||||
-rw-r--r-- | lib/isexpired.c | 15 | ||||
-rw-r--r-- | src/chage.c | 52 | ||||
-rw-r--r-- | src/passwd.c | 9 |
4 files changed, 36 insertions, 52 deletions
@@ -13,14 +13,11 @@ #include <stdio.h> #include <time.h> #include <errno.h> -#include <pwd.h> -#include <grp.h> - -#include "adds.h" +#include "prototypes.h" #include "defines.h" #include "exitcodes.h" -#include "prototypes.h" - +#include <pwd.h> +#include <grp.h> #ident "$Id$" @@ -165,8 +162,7 @@ void agecheck (/*@null@*/const struct spwd *sp) return; } - remain = addsl(sp->sp_lstchg, sp->sp_max, -now); - + remain = sp->sp_lstchg + sp->sp_max - now; if (remain <= sp->sp_warn) { if (remain > 1) { (void) printf (_("Your password will expire in %ld days.\n"), diff --git a/lib/isexpired.c b/lib/isexpired.c index c275691f..45c7601e 100644 --- a/lib/isexpired.c +++ b/lib/isexpired.c @@ -15,13 +15,11 @@ #include <config.h> #include <sys/types.h> +#include "prototypes.h" +#include "defines.h" #include <pwd.h> #include <time.h> -#include "adds.h" -#include "defines.h" -#include "prototypes.h" - #ident "$Id$" @@ -40,7 +38,7 @@ */ int isexpired (const struct passwd *pw, /*@null@*/const struct spwd *sp) { - long now; + long now; now = time(NULL) / DAY; @@ -74,8 +72,7 @@ int isexpired (const struct passwd *pw, /*@null@*/const struct spwd *sp) if ( (sp->sp_lstchg > 0) && (sp->sp_max >= 0) && (sp->sp_inact >= 0) - && (now >= addsl(sp->sp_lstchg, sp->sp_max, sp->sp_inact))) - { + && (now >= (sp->sp_lstchg + sp->sp_max + sp->sp_inact))) { return 2; } @@ -97,9 +94,9 @@ int isexpired (const struct passwd *pw, /*@null@*/const struct spwd *sp) * the password has expired. */ - if (now >= addsl(sp->sp_lstchg, sp->sp_max)) + if (now >= (sp->sp_lstchg + sp->sp_max)) { return 1; - + } return 0; } diff --git a/src/chage.c b/src/chage.c index ecbf8738..8a6d3584 100644 --- a/src/chage.c +++ b/src/chage.c @@ -72,7 +72,7 @@ static long expdate; /* local function prototypes */ NORETURN static void usage (int status); static int new_fields (void); -static void print_day_as_date (long day); +static void print_date (time_t date); static void list_fields (void); static void process_flags (int argc, char **argv); static void check_flags (int argc, int opt_index); @@ -227,22 +227,10 @@ static int new_fields (void) return 1; } - -static void -print_day_as_date(long day) +static void print_date (time_t date) { - char buf[80]; - time_t date; - struct tm *tp; - - if (day < 0) { - puts(_("never")); - return; - } - if (__builtin_mul_overflow(day, DAY, &date)) { - puts(_("future")); - return; - } + struct tm *tp; + char buf[80]; tp = gmtime (&date); if (NULL == tp) { @@ -253,7 +241,6 @@ print_day_as_date(long day) } } - /* * list_fields - display the current values of the expiration fields * @@ -263,15 +250,21 @@ print_day_as_date(long day) */ static void list_fields (void) { + long changed = 0; + long expires; + /* * The "last change" date is either "never" or the date the password * was last modified. The date is the number of days since 1/1/1970. */ (void) fputs (_("Last password change\t\t\t\t\t: "), stdout); - if (lstchgdate == 0) { + if (lstchgdate < 0 || lstchgdate > LONG_MAX / DAY) { + (void) puts (_("never")); + } else if (lstchgdate == 0) { (void) puts (_("password must be changed")); } else { - print_day_as_date(lstchgdate); + changed = lstchgdate * DAY; + print_date (changed); } /* @@ -284,11 +277,11 @@ static void list_fields (void) } else if ( (lstchgdate < 0) || (maxdays >= 10000) || (maxdays < 0) - || (LONG_MAX - lstchgdate < maxdays)) - { + || ((LONG_MAX - changed) / DAY < maxdays)) { (void) puts (_("never")); } else { - print_day_as_date(lstchgdate + maxdays); + expires = changed + maxdays * DAY; + print_date (expires); } /* @@ -304,12 +297,12 @@ static void list_fields (void) || (inactdays < 0) || (maxdays >= 10000) || (maxdays < 0) - || (LONG_MAX - inactdays < maxdays) - || (LONG_MAX - lstchgdate < maxdays + inactdays)) - { + || (maxdays > LONG_MAX - inactdays) + || ((LONG_MAX - changed) / DAY < maxdays + inactdays)) { (void) puts (_("never")); } else { - print_day_as_date(lstchgdate + maxdays + inactdays); + expires = changed + (maxdays + inactdays) * DAY; + print_date (expires); } /* @@ -317,7 +310,12 @@ static void list_fields (void) * password expiring or not. */ (void) fputs (_("Account expires\t\t\t\t\t\t: "), stdout); - print_day_as_date(expdate); + if (expdate < 0 || LONG_MAX / DAY < expdate) { + (void) puts (_("never")); + } else { + expires = expdate * DAY; + print_date (expires); + } /* * Start with the easy numbers - the number of days before the diff --git a/src/passwd.c b/src/passwd.c index ee25373b..4549d95d 100644 --- a/src/passwd.c +++ b/src/passwd.c @@ -195,7 +195,6 @@ static int new_password (const struct passwd *pw) char orig[PASS_MAX + 1]; /* Original password */ char pass[PASS_MAX + 1]; /* New password */ int i; /* Counter for retries */ - int ret; bool warned; int pass_max_len = -1; const char *method; @@ -301,14 +300,8 @@ static int new_password (const struct passwd *pw) if (warned && (strcmp (pass, cp) != 0)) { warned = false; } - ret = STRTCPY (pass, cp); + STRFCPY (pass, cp); erase_pass (cp); - if (ret == -1) { - (void) fputs (_("Password is too long.\n"), stderr); - memzero (orig, sizeof orig); - memzero (pass, sizeof pass); - return -1; - } if (!amroot && (!obscure (orig, pass, pw) || reuse (pass, pw))) { (void) puts (_("Try again.")); |