*** a/src/backend/utils/misc/guc-file.l
--- b/src/backend/utils/misc/guc-file.l
***************
*** 110,132 **** ProcessConfigFile(GucContext context)
  				   *tail;
  	char	   *cvc = NULL;
  	struct config_string *cvc_struct;
! 	int 		i;
  	bool		OK = true;
  
! 	Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
! 
! 	if (context == PGC_SIGHUP)
! 	{
! 		/*
! 		 * To avoid cluttering the log, only the postmaster bleats loudly
! 		 * about problems with the config file.
! 		 */
! 		elevel = IsUnderPostmaster ? DEBUG2 : LOG;
! 	}
! 	else
! 		elevel = LOG;
! 
! 	/* Parse the file into a list of option names and values */
  	head = tail = NULL;
  
  	if (!ParseConfigFile(ConfigFileName, NULL, 0, elevel, &head, &tail))
--- 110,134 ----
  				   *tail;
  	char	   *cvc = NULL;
  	struct config_string *cvc_struct;
! 	int			i;
  	bool		OK = true;
  
! 	/* Config files are only processes on startup (by the postmaster)
! 	 * and on SIGHUP (by the postmaster and backends)
! 	 */
! 	Assert((context == PGC_POSTMASTER && !IsUnderPostmaster) ||
! 			context == PGC_SIGHUP);
! 	/*
! 	 * To avoid cluttering the log, only the postmaster bleats loudly
! 	 * about problems with the config file.
! 	 */
! 	elevel = IsUnderPostmaster ? DEBUG2 : LOG;
! 	
! 	/* Parse the file into a list of option names and values.
! 	 * We continue even if we hit a parse errors because we
! 	 * also want to report invalid value in the parts we
! 	 * could parse
! 	 */
  	head = tail = NULL;
  
  	if (!ParseConfigFile(ConfigFileName, NULL, 0, elevel, &head, &tail))
***************
*** 592,598 **** ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel,
  		/* skip over parse_error if we made it this far without errors */
  		continue;
  	
!  	parse_error:
  		if (token == GUC_EOL || token == 0)
  			ereport(elevel,
  					(errcode(ERRCODE_SYNTAX_ERROR),
--- 594,600 ----
  		/* skip over parse_error if we made it this far without errors */
  		continue;
  	
! 	parse_error:
  		if (token == GUC_EOL || token == 0)
  			ereport(elevel,
  					(errcode(ERRCODE_SYNTAX_ERROR),
***************
*** 605,611 **** ParseConfigFp(FILE *fp, const char *config_file, int depth, int elevel,
  							config_file, ConfigFileLineno, yytext)));
  		errorcount++;
  		/* fast forward till the next EOL/EOF */
! 		while (token && token != GUC_EOL)
  			token = yylex();
  		
  		/* break out of loop on EOF */
--- 607,613 ----
  							config_file, ConfigFileLineno, yytext)));
  		errorcount++;
  		/* fast forward till the next EOL/EOF */
! 		while (token != 0 && token != GUC_EOL)
  			token = yylex();
  		
  		/* break out of loop on EOF */
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
***************
*** 5055,5061 **** config_enum_get_options(struct config_enum * record, const char *prefix,
   *
   * If there is an error (non-existing option, invalid value) then an
   * ereport(ERROR) is thrown *unless* this is called in a context where we
!  * don't want to ereport (currently, startup or SIGHUP config file reread).
   * In that case we write a suitable error message via ereport(LOG) and
   * return false. This is working around the deficiencies in the ereport
   * mechanism, so don't blame me.  In all other cases, the function
--- 5055,5061 ----
   *
   * If there is an error (non-existing option, invalid value) then an
   * ereport(ERROR) is thrown *unless* this is called in a context where we
!  * don't want to ereport (currently, settings defaults and cfg file reading).
   * In that case we write a suitable error message via ereport(LOG) and
   * return false. This is working around the deficiencies in the ereport
   * mechanism, so don't blame me.  In all other cases, the function
