mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
Fix load_user/load_group to not leave dangling pointers around if the
config files are present on one pass and not present on a later pass.
This commit is contained in:
parent
c19354dfb5
commit
61c9ea0f3c
@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.95 2003/03/20 03:34:55 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.96 2003/04/03 21:25:02 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -387,7 +387,7 @@ get_group_line(const char *group)
|
||||
/*
|
||||
* Lookup a user name in the pg_shadow file
|
||||
*/
|
||||
List **
|
||||
List **
|
||||
get_user_line(const char *user)
|
||||
{
|
||||
return (List **) bsearch((void *) user,
|
||||
@ -401,7 +401,7 @@ get_user_line(const char *user)
|
||||
/*
|
||||
* Check group for a specific user.
|
||||
*/
|
||||
static int
|
||||
static bool
|
||||
check_group(char *group, char *user)
|
||||
{
|
||||
List **line,
|
||||
@ -411,16 +411,16 @@ check_group(char *group, char *user)
|
||||
{
|
||||
foreach(l, lnext(lnext(*line)))
|
||||
if (strcmp(lfirst(l), user) == 0)
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check comma user list for a specific user, handle group names.
|
||||
*/
|
||||
static int
|
||||
static bool
|
||||
check_user(char *user, char *param_str)
|
||||
{
|
||||
char *tok;
|
||||
@ -430,20 +430,20 @@ check_user(char *user, char *param_str)
|
||||
if (tok[0] == '+')
|
||||
{
|
||||
if (check_group(tok + 1, user))
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(tok, user) == 0 ||
|
||||
strcmp(tok, "all") == 0)
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check to see if db/user combination matches param string.
|
||||
*/
|
||||
static int
|
||||
static bool
|
||||
check_db(char *dbname, char *user, char *param_str)
|
||||
{
|
||||
char *tok;
|
||||
@ -451,21 +451,21 @@ check_db(char *dbname, char *user, char *param_str)
|
||||
for (tok = strtok(param_str, MULTI_VALUE_SEP); tok != NULL; tok = strtok(NULL, MULTI_VALUE_SEP))
|
||||
{
|
||||
if (strcmp(tok, "all") == 0)
|
||||
return 1;
|
||||
return true;
|
||||
else if (strcmp(tok, "sameuser") == 0)
|
||||
{
|
||||
if (strcmp(dbname, user) == 0)
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(tok, "samegroup") == 0)
|
||||
{
|
||||
if (check_group(dbname, user))
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(tok, dbname) == 0)
|
||||
return 1;
|
||||
return true;
|
||||
}
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -752,13 +752,18 @@ user_openfile(void)
|
||||
* Load group/user name mapping file
|
||||
*/
|
||||
void
|
||||
load_group()
|
||||
load_group(void)
|
||||
{
|
||||
FILE *group_file;
|
||||
List *line;
|
||||
|
||||
/* Discard any old data */
|
||||
if (group_lines)
|
||||
free_lines(&group_lines);
|
||||
if (group_sorted)
|
||||
pfree(group_sorted);
|
||||
group_sorted = NULL;
|
||||
group_length = 0;
|
||||
|
||||
group_file = group_openfile();
|
||||
if (!group_file)
|
||||
@ -767,8 +772,6 @@ load_group()
|
||||
FreeFile(group_file);
|
||||
|
||||
/* create sorted lines for binary searching */
|
||||
if (group_sorted)
|
||||
pfree(group_sorted);
|
||||
group_length = length(group_lines);
|
||||
if (group_length)
|
||||
{
|
||||
@ -779,10 +782,11 @@ load_group()
|
||||
foreach(line, group_lines)
|
||||
group_sorted[i++] = lfirst(line);
|
||||
|
||||
qsort((void *) group_sorted, group_length, sizeof(List *), user_group_qsort_cmp);
|
||||
qsort((void *) group_sorted,
|
||||
group_length,
|
||||
sizeof(List *),
|
||||
user_group_qsort_cmp);
|
||||
}
|
||||
else
|
||||
group_sorted = NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -790,13 +794,18 @@ load_group()
|
||||
* Load user/password mapping file
|
||||
*/
|
||||
void
|
||||
load_user()
|
||||
load_user(void)
|
||||
{
|
||||
FILE *user_file;
|
||||
List *line;
|
||||
|
||||
/* Discard any old data */
|
||||
if (user_lines)
|
||||
free_lines(&user_lines);
|
||||
if (user_sorted)
|
||||
pfree(user_sorted);
|
||||
user_sorted = NULL;
|
||||
user_length = 0;
|
||||
|
||||
user_file = user_openfile();
|
||||
if (!user_file)
|
||||
@ -805,8 +814,6 @@ load_user()
|
||||
FreeFile(user_file);
|
||||
|
||||
/* create sorted lines for binary searching */
|
||||
if (user_sorted)
|
||||
pfree(user_sorted);
|
||||
user_length = length(user_lines);
|
||||
if (user_length)
|
||||
{
|
||||
@ -817,10 +824,11 @@ load_user()
|
||||
foreach(line, user_lines)
|
||||
user_sorted[i++] = lfirst(line);
|
||||
|
||||
qsort((void *) user_sorted, user_length, sizeof(List *), user_group_qsort_cmp);
|
||||
qsort((void *) user_sorted,
|
||||
user_length,
|
||||
sizeof(List *),
|
||||
user_group_qsort_cmp);
|
||||
}
|
||||
else
|
||||
user_sorted = NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -848,11 +856,9 @@ load_hba(void)
|
||||
|
||||
file = AllocateFile(conf_file, "r");
|
||||
if (file == NULL)
|
||||
{
|
||||
elog(FATAL,
|
||||
"load_hba: Unable to open authentication config file \"%s\": %m",
|
||||
conf_file);
|
||||
}
|
||||
|
||||
hba_lines = tokenize_file(file);
|
||||
FreeFile(file);
|
||||
|
Loading…
Reference in New Issue
Block a user