summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Mraz <tmraz@redhat.com>2012-08-16 19:47:21 +0200
committerTomas Mraz <tmraz@redhat.com>2012-08-16 19:47:21 +0200
commit6be712e7fd905f9994f1cd1765ad81ce44e2dd8b (patch)
treebcad2f2d0c442f48179346423cff61cbbb86564f /src
parente5e3feab7f12756daf6210477d706e11dbcce720 (diff)
downloadlibpwquality-6be712e7fd905f9994f1cd1765ad81ce44e2dd8b.tar.gz
Handle fgetpwent_r() returning ERANGE more gracefully.
Diffstat (limited to 'src')
-rw-r--r--src/pam_pwquality.c14
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