changeset fb285e90206f in /srv/hg/libpwquality
details:
http://hg.fedorahosted.org/hg/srv/hg/libpwquality?cmd=changeset;node=fb28...
summary: Handle fgetpwent_r() returning ERANGE more gracefully.
diffstat:
src/pam_pwquality.c | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
diffs (46 lines):
diff -r c2eed11c4d58 -r fb285e90206f src/pam_pwquality.c
--- a/src/pam_pwquality.c Thu Aug 16 19:38:32 2012 +0200
+++ b/src/pam_pwquality.c Thu Aug 16 19:47:21 2012 +0200
@@ -125,16 +125,22 @@
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 @@
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 @@
/*
* Copyright (c) Cristian Gafton <gafton(a)redhat.com>, 1996.
* All rights reserved
- * Copyright (c) Red Hat, Inc, 2011
+ * Copyright (c) Red Hat, Inc, 2011, 2012
* Copyright (c) Tomas Mraz <tm(a)t8m.info>, 2011
*
* Redistribution and use in source and binary forms, with or without