1010 *
1111 *
1212 * IDENTIFICATION
13- * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.120 2004/02/02 16:58:30 neilc Exp $
13+ * $PostgreSQL: pgsql/src/backend/libpq/hba.c,v 1.121 2004/05/19 22:06:16 tgl Exp $
1414 *
1515 *-------------------------------------------------------------------------
1616 */
@@ -518,58 +518,60 @@ check_db(char *dbname, char *user, char *param_str)
518518/*
519519 *Scan the rest of a host record (after the mask field)
520520 *and return the interpretation of it as *userauth_p, *auth_arg_p, and
521- **error_p. line points to the next token of the line.
521+ **error_p. *line points to the next token of the line, and is
522+ *advanced over successfully-read tokens.
522523 */
523524static void
524- parse_hba_auth (List * line ,UserAuth * userauth_p ,char * * auth_arg_p ,
525+ parse_hba_auth (List * * line ,UserAuth * userauth_p ,char * * auth_arg_p ,
525526bool * error_p )
526527{
527528char * token ;
528529
529530* auth_arg_p = NULL ;
530531
531- if (!line )
532- * error_p = true;
533- else
532+ /* Get authentication type token. */
533+ if (!* line )
534534{
535- /* Get authentication type token. */
536- token = lfirst (line );
537- if (strcmp (token ,"trust" )== 0 )
538- * userauth_p = uaTrust ;
539- else if (strcmp (token ,"ident" )== 0 )
540- * userauth_p = uaIdent ;
541- else if (strcmp (token ,"password" )== 0 )
542- * userauth_p = uaPassword ;
543- else if (strcmp (token ,"krb4" )== 0 )
544- * userauth_p = uaKrb4 ;
545- else if (strcmp (token ,"krb5" )== 0 )
546- * userauth_p = uaKrb5 ;
547- else if (strcmp (token ,"reject" )== 0 )
548- * userauth_p = uaReject ;
549- else if (strcmp (token ,"md5" )== 0 )
550- * userauth_p = uaMD5 ;
551- else if (strcmp (token ,"crypt" )== 0 )
552- * userauth_p = uaCrypt ;
535+ * error_p = true;
536+ return ;
537+ }
538+ token = lfirst (* line );
539+ if (strcmp (token ,"trust" )== 0 )
540+ * userauth_p = uaTrust ;
541+ else if (strcmp (token ,"ident" )== 0 )
542+ * userauth_p = uaIdent ;
543+ else if (strcmp (token ,"password" )== 0 )
544+ * userauth_p = uaPassword ;
545+ else if (strcmp (token ,"krb4" )== 0 )
546+ * userauth_p = uaKrb4 ;
547+ else if (strcmp (token ,"krb5" )== 0 )
548+ * userauth_p = uaKrb5 ;
549+ else if (strcmp (token ,"reject" )== 0 )
550+ * userauth_p = uaReject ;
551+ else if (strcmp (token ,"md5" )== 0 )
552+ * userauth_p = uaMD5 ;
553+ else if (strcmp (token ,"crypt" )== 0 )
554+ * userauth_p = uaCrypt ;
553555#ifdef USE_PAM
554- else if (strcmp (token , "pam ")== 0 )
555- * userauth_p = uaPAM ;
556+ else if (strcmp (token , "pam ")== 0 )
557+ * userauth_p = uaPAM ;
556558#endif
557- else
558- * error_p = true;
559- line = lnext (line );
559+ else
560+ {
561+ * error_p = true;
562+ return ;
560563}
564+ * line = lnext (* line );
561565
562- if (!* error_p )
566+ /* Get the authentication argument token, if any */
567+ if (* line )
563568{
564- /* Get the authentication argument token, if any */
565- if (line )
566- {
567- token = lfirst (line );
568- * auth_arg_p = pstrdup (token );
569- /* If there is more on the line, it is an error */
570- if (lnext (line ))
571- * error_p = true;
572- }
569+ token = lfirst (* line );
570+ * auth_arg_p = pstrdup (token );
571+ * line = lnext (* line );
572+ /* If there is more on the line, it is an error */
573+ if (* line )
574+ * error_p = true;
573575}
574576}
575577
@@ -623,7 +625,7 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
623625gotohba_syntax ;
624626
625627/* Read the rest of the line. */
626- parse_hba_auth (line ,& port -> auth_method ,& port -> auth_arg ,error_p );
628+ parse_hba_auth (& line ,& port -> auth_method ,& port -> auth_arg ,error_p );
627629if (* error_p )
628630gotohba_syntax ;
629631
@@ -704,13 +706,13 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
704706{
705707ereport (LOG ,
706708(errcode (ERRCODE_CONFIG_FILE_ERROR ),
707- errmsg ("invalid IP address \"%s\" in pg_hba.conf file: %s" ,
708- token ,gai_strerror (ret ))));
709+ errmsg ("invalid IP address \"%s\" in pg_hba.conf file line %d : %s" ,
710+ token ,line_number , gai_strerror (ret ))));
709711if (cidr_slash )
710712* cidr_slash = '/' ;
711713if (gai_result )
712714freeaddrinfo_all (hints .ai_family ,gai_result );
713- gotohba_syntax ;
715+ gotohba_other_error ;
714716}
715717
716718if (cidr_slash )
@@ -736,16 +738,26 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
736738ret = getaddrinfo_all (token ,NULL ,& hints ,& gai_result );
737739if (ret || !gai_result )
738740{
741+ ereport (LOG ,
742+ (errcode (ERRCODE_CONFIG_FILE_ERROR ),
743+ errmsg ("invalid IP mask \"%s\" in pg_hba.conf file line %d: %s" ,
744+ token ,line_number ,gai_strerror (ret ))));
739745if (gai_result )
740746freeaddrinfo_all (hints .ai_family ,gai_result );
741- gotohba_syntax ;
747+ gotohba_other_error ;
742748}
743749
744750memcpy (& mask ,gai_result -> ai_addr ,gai_result -> ai_addrlen );
745751freeaddrinfo_all (hints .ai_family ,gai_result );
746752
747753if (addr .ss_family != mask .ss_family )
748- gotohba_syntax ;
754+ {
755+ ereport (LOG ,
756+ (errcode (ERRCODE_CONFIG_FILE_ERROR ),
757+ errmsg ("IP address and mask do not match in pg_hba.conf file line %d" ,
758+ line_number )));
759+ gotohba_other_error ;
760+ }
749761}
750762
751763if (addr .ss_family != port -> raddr .addr .ss_family )
@@ -778,13 +790,14 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
778790line = lnext (line );
779791if (!line )
780792gotohba_syntax ;
781- parse_hba_auth (line ,& port -> auth_method ,& port -> auth_arg ,error_p );
793+ parse_hba_auth (& line ,& port -> auth_method ,& port -> auth_arg ,error_p );
782794if (* error_p )
783795gotohba_syntax ;
784796}
785797else
786798gotohba_syntax ;
787799
800+ /* Does the entry match database and user? */
788801if (!check_db (port -> database_name ,port -> user_name ,db ))
789802return ;
790803if (!check_user (port -> user_name ,user ))
@@ -806,6 +819,8 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
806819errmsg ("missing field in pg_hba.conf file at end of line %d" ,
807820line_number )));
808821
822+ /* Come here if suitable message already logged */
823+ hba_other_error :
809824* error_p = true;
810825}
811826