aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGarance A Drosehn <gad@FreeBSD.org>2000-12-02 00:07:56 +0000
committerGarance A Drosehn <gad@FreeBSD.org>2000-12-02 00:07:56 +0000
commitbbe8edb0ac4fc0e8b89dfe6000e2ced76bcfbef6 (patch)
treea46ff3882428e1aecc405c5e657e449523c3c261 /lib
parent1c32c37c06aa427bff3f780b962f7e599d29cde4 (diff)
downloadsrc-bbe8edb0ac4fc0e8b89dfe6000e2ced76bcfbef6.tar.gz
src-bbe8edb0ac4fc0e8b89dfe6000e2ced76bcfbef6.zip
Fix some error-handling logic so that ferror is called before fclose,
instead of immediately after the fclose. The previous logic did work on freebsd, but is somewhat risky practice (and causes trouble when porting to other OS's). PR: bin/22965 Reviewed by: Garrett Wollman
Notes
Notes: svn path=/head/; revision=69502
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/getcap.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/lib/libc/gen/getcap.c b/lib/libc/gen/getcap.c
index b3261aeb54ae..edb828b0fad0 100644
--- a/lib/libc/gen/getcap.c
+++ b/lib/libc/gen/getcap.c
@@ -647,7 +647,7 @@ cgetnext(bp, db_array)
char **db_array;
{
size_t len;
- int status, i, done;
+ int done, hadreaderr, i, savederrno, status;
char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE];
u_int dummy;
@@ -665,9 +665,14 @@ cgetnext(bp, db_array)
} else {
line = fgetln(pfp, &len);
if (line == NULL && pfp) {
- (void)fclose(pfp);
- if (ferror(pfp)) {
- (void)cgetclose();
+ hadreaderr = ferror(pfp);
+ if (hadreaderr)
+ savederrno = errno;
+ fclose(pfp);
+ pfp = NULL;
+ if (hadreaderr) {
+ cgetclose();
+ errno = savederrno;
return (-1);
} else {
if (*++dbp == NULL) {
@@ -724,9 +729,18 @@ cgetnext(bp, db_array)
} else { /* name field extends beyond the line */
line = fgetln(pfp, &len);
if (line == NULL && pfp) {
- (void)fclose(pfp);
- if (ferror(pfp)) {
- (void)cgetclose();
+ /* Name extends beyond the EOF! */
+ hadreaderr = ferror(pfp);
+ if (hadreaderr)
+ savederrno = errno;
+ fclose(pfp);
+ pfp = NULL;
+ if (hadreaderr) {
+ cgetclose();
+ errno = savederrno;
+ return (-1);
+ } else {
+ cgetclose();
return (-1);
}
} else