]> granicus.if.org Git - postgresql/commitdiff
verify_password() leaked a file descriptor if it failed to find the given
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 23 Nov 1999 01:04:38 +0000 (01:04 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 23 Nov 1999 01:04:38 +0000 (01:04 +0000)
userid in the flat password file.  Do it enough times and the postmaster
panicked :-(

src/backend/libpq/password.c

index 3722d2bd7f5aec444b932d76fe009843a185e157..d18fcca475b14b9244a3424498f365bb88b2fa52 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: password.c,v 1.26 1999/10/23 03:13:21 tgl Exp $
+ * $Id: password.c,v 1.27 1999/11/23 01:04:38 tgl Exp $
  *
  */
 
@@ -45,6 +45,8 @@ verify_password(char *auth_arg, char *user, char *password)
                return STATUS_ERROR;
        }
 
+       pfree(pw_file_fullname);
+
        while (!feof(pw_file))
        {
                char            pw_file_line[255],
@@ -67,15 +69,12 @@ verify_password(char *auth_arg, char *user, char *password)
 
                if (strcmp(user, test_user) == 0)
                {
-                       /* we're outta here one way or the other. */
+                       /* we're outta here one way or the other, so close file */
                        FreeFile(pw_file);
 
                        if (strcmp(crypt(password, test_pw), test_pw) == 0)
                        {
                                /* it matched. */
-
-                               pfree(pw_file_fullname);
-
                                return STATUS_OK;
                        }
 
@@ -85,19 +84,17 @@ verify_password(char *auth_arg, char *user, char *password)
                        fputs(PQerrormsg, stderr);
                        pqdebug("%s", PQerrormsg);
 
-                       pfree(pw_file_fullname);
-
                        return STATUS_ERROR;
                }
        }
 
+       FreeFile(pw_file);
+
        snprintf(PQerrormsg, PQERRORMSG_LENGTH,
                         "verify_password: user '%s' not found in password file.\n",
                         user);
        fputs(PQerrormsg, stderr);
        pqdebug("%s", PQerrormsg);
 
-       pfree(pw_file_fullname);
-
        return STATUS_ERROR;
 }