*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.120 2004/02/02 16:58:30 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.121 2004/05/19 22:06:16 tgl Exp $
*
*-------------------------------------------------------------------------
*/
/*
* Scan the rest of a host record (after the mask field)
* and return the interpretation of it as *userauth_p, *auth_arg_p, and
- * *error_p. line points to the next token of the line.
+ * *error_p. *line points to the next token of the line, and is
+ * advanced over successfully-read tokens.
*/
static void
-parse_hba_auth(List *line, UserAuth *userauth_p, char **auth_arg_p,
+parse_hba_auth(List **line, UserAuth *userauth_p, char **auth_arg_p,
bool *error_p)
{
char *token;
*auth_arg_p = NULL;
- if (!line)
- *error_p = true;
- else
+ /* Get authentication type token. */
+ if (!*line)
{
- /* Get authentication type token. */
- token = lfirst(line);
- if (strcmp(token, "trust") == 0)
- *userauth_p = uaTrust;
- else if (strcmp(token, "ident") == 0)
- *userauth_p = uaIdent;
- else if (strcmp(token, "password") == 0)
- *userauth_p = uaPassword;
- else if (strcmp(token, "krb4") == 0)
- *userauth_p = uaKrb4;
- else if (strcmp(token, "krb5") == 0)
- *userauth_p = uaKrb5;
- else if (strcmp(token, "reject") == 0)
- *userauth_p = uaReject;
- else if (strcmp(token, "md5") == 0)
- *userauth_p = uaMD5;
- else if (strcmp(token, "crypt") == 0)
- *userauth_p = uaCrypt;
+ *error_p = true;
+ return;
+ }
+ token = lfirst(*line);
+ if (strcmp(token, "trust") == 0)
+ *userauth_p = uaTrust;
+ else if (strcmp(token, "ident") == 0)
+ *userauth_p = uaIdent;
+ else if (strcmp(token, "password") == 0)
+ *userauth_p = uaPassword;
+ else if (strcmp(token, "krb4") == 0)
+ *userauth_p = uaKrb4;
+ else if (strcmp(token, "krb5") == 0)
+ *userauth_p = uaKrb5;
+ else if (strcmp(token, "reject") == 0)
+ *userauth_p = uaReject;
+ else if (strcmp(token, "md5") == 0)
+ *userauth_p = uaMD5;
+ else if (strcmp(token, "crypt") == 0)
+ *userauth_p = uaCrypt;
#ifdef USE_PAM
- else if (strcmp(token, "pam") == 0)
- *userauth_p = uaPAM;
+ else if (strcmp(token, "pam") == 0)
+ *userauth_p = uaPAM;
#endif
- else
- *error_p = true;
- line = lnext(line);
+ else
+ {
+ *error_p = true;
+ return;
}
+ *line = lnext(*line);
- if (!*error_p)
+ /* Get the authentication argument token, if any */
+ if (*line)
{
- /* Get the authentication argument token, if any */
- if (line)
- {
- token = lfirst(line);
- *auth_arg_p = pstrdup(token);
- /* If there is more on the line, it is an error */
- if (lnext(line))
- *error_p = true;
- }
+ token = lfirst(*line);
+ *auth_arg_p = pstrdup(token);
+ *line = lnext(*line);
+ /* If there is more on the line, it is an error */
+ if (*line)
+ *error_p = true;
}
}
goto hba_syntax;
/* Read the rest of the line. */
- parse_hba_auth(line, &port->auth_method, &port->auth_arg, error_p);
+ parse_hba_auth(&line, &port->auth_method, &port->auth_arg, error_p);
if (*error_p)
goto hba_syntax;
{
ereport(LOG,
(errcode(ERRCODE_CONFIG_FILE_ERROR),
- errmsg("invalid IP address \"%s\" in pg_hba.conf file: %s",
- token, gai_strerror(ret))));
+ errmsg("invalid IP address \"%s\" in pg_hba.conf file line %d: %s",
+ token, line_number, gai_strerror(ret))));
if (cidr_slash)
*cidr_slash = '/';
if (gai_result)
freeaddrinfo_all(hints.ai_family, gai_result);
- goto hba_syntax;
+ goto hba_other_error;
}
if (cidr_slash)
ret = getaddrinfo_all(token, NULL, &hints, &gai_result);
if (ret || !gai_result)
{
+ ereport(LOG,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("invalid IP mask \"%s\" in pg_hba.conf file line %d: %s",
+ token, line_number, gai_strerror(ret))));
if (gai_result)
freeaddrinfo_all(hints.ai_family, gai_result);
- goto hba_syntax;
+ goto hba_other_error;
}
memcpy(&mask, gai_result->ai_addr, gai_result->ai_addrlen);
freeaddrinfo_all(hints.ai_family, gai_result);
if (addr.ss_family != mask.ss_family)
- goto hba_syntax;
+ {
+ ereport(LOG,
+ (errcode(ERRCODE_CONFIG_FILE_ERROR),
+ errmsg("IP address and mask do not match in pg_hba.conf file line %d",
+ line_number)));
+ goto hba_other_error;
+ }
}
if (addr.ss_family != port->raddr.addr.ss_family)
line = lnext(line);
if (!line)
goto hba_syntax;
- parse_hba_auth(line, &port->auth_method, &port->auth_arg, error_p);
+ parse_hba_auth(&line, &port->auth_method, &port->auth_arg, error_p);
if (*error_p)
goto hba_syntax;
}
else
goto hba_syntax;
+ /* Does the entry match database and user? */
if (!check_db(port->database_name, port->user_name, db))
return;
if (!check_user(port->user_name, user))
errmsg("missing field in pg_hba.conf file at end of line %d",
line_number)));
+ /* Come here if suitable message already logged */
+hba_other_error:
*error_p = true;
}