diff options
author | Tomas Mraz <tmraz@redhat.com> | 2012-08-16 19:47:21 +0200 |
---|---|---|
committer | Tomas Mraz <tmraz@redhat.com> | 2012-08-16 19:47:21 +0200 |
commit | 6be712e7fd905f9994f1cd1765ad81ce44e2dd8b (patch) | |
tree | bcad2f2d0c442f48179346423cff61cbbb86564f /src | |
parent | e5e3feab7f12756daf6210477d706e11dbcce720 (diff) | |
download | libpwquality-6be712e7fd905f9994f1cd1765ad81ce44e2dd8b.tar.gz |
Handle fgetpwent_r() returning ERANGE more gracefully.
Diffstat (limited to 'src')
-rw-r--r-- | src/pam_pwquality.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/pam_pwquality.c b/src/pam_pwquality.c index 0e4e8f8..82104ee 100644 --- a/src/pam_pwquality.c +++ b/src/pam_pwquality.c @@ -125,16 +125,22 @@ check_local_user (pam_handle_t *pamh, fp = fopen(PATH_PASSWD, "r"); if (fp == NULL) { - pam_syslog(pamh, LOG_ERR, "pam_pwquality: unable to open %s: %s", + pam_syslog(pamh, LOG_ERR, "unable to open %s: %s", PATH_PASSWD, pam_strerror(pamh, errno)); return -1; } for (;;) { errn = fgetpwent_r(fp, &pw, buf, sizeof (buf), &pwp); + if (errn == ERANGE) { + pam_syslog(pamh, LOG_WARNING, "%s contains very long lines; corrupted?", + PATH_PASSWD); + /* we can continue here as next call will read further */ + continue; + } if (errn != 0) break; - if (strcmp (pwp->pw_name, user) == 0) { + if (strcmp(pwp->pw_name, user) == 0) { found = 1; break; } @@ -143,7 +149,7 @@ check_local_user (pam_handle_t *pamh, fclose (fp); if (errn != 0 && errn != ENOENT) { - pam_syslog(pamh, LOG_ERR, "pam_pwquality: unable to enumerate local accounts: %s", + pam_syslog(pamh, LOG_ERR, "unable to enumerate local accounts: %s", pam_strerror(pamh, errn)); return -1; } else { @@ -289,7 +295,7 @@ struct pam_module _pam_pwquality_modstruct = { /* * Copyright (c) Cristian Gafton <gafton@redhat.com>, 1996. * All rights reserved - * Copyright (c) Red Hat, Inc, 2011 + * Copyright (c) Red Hat, Inc, 2011, 2012 * Copyright (c) Tomas Mraz <tm@t8m.info>, 2011 * * Redistribution and use in source and binary forms, with or without |