*** a/src/interfaces/libpq/fe-connect.c --- b/src/interfaces/libpq/fe-connect.c *************** *** 297,302 **** static PQconninfoOption *conninfo_parse(const char *conninfo, --- 297,304 ---- static PQconninfoOption *conninfo_array_parse(const char *const * keywords, const char *const * values, PQExpBuffer errorMessage, bool use_defaults, int expand_dbname); + static bool conninfo_fill_defaults(PQconninfoOption *options, + PQExpBuffer errorMessage); static char *conninfo_getval(PQconninfoOption *connOptions, const char *keyword); static void defaultNoticeReceiver(void *arg, const PGresult *res); *************** *** 836,842 **** PQconndefaults(void) initPQExpBuffer(&errorBuf); if (PQExpBufferDataBroken(errorBuf)) return NULL; /* out of memory already :-( */ ! connOptions = conninfo_parse("", &errorBuf, true); termPQExpBuffer(&errorBuf); return connOptions; } --- 838,860 ---- initPQExpBuffer(&errorBuf); if (PQExpBufferDataBroken(errorBuf)) return NULL; /* out of memory already :-( */ ! ! /* Make a working copy of PQconninfoOptions */ ! connOptions = malloc(sizeof(PQconninfoOptions)); ! if (connOptions == NULL) ! { ! printfPQExpBuffer(&errorBuf, ! libpq_gettext("out of memory\n")); ! return NULL; ! } ! memcpy(connOptions, PQconninfoOptions, sizeof(PQconninfoOptions)); ! ! if (!conninfo_fill_defaults(connOptions, &errorBuf)) ! { ! PQconninfoFree(connOptions); ! connOptions = NULL; ! } ! termPQExpBuffer(&errorBuf); return connOptions; } *************** *** 4002,4008 **** conninfo_parse(const char *conninfo, PQExpBuffer errorMessage, char *pname; char *pval; char *buf; - char *tmp; char *cp; char *cp2; PQconninfoOption *options; --- 4020,4025 ---- *************** *** 4170,4245 **** conninfo_parse(const char *conninfo, PQExpBuffer errorMessage, free(buf); /* ! * Stop here if caller doesn't want defaults filled in. ! */ ! if (!use_defaults) ! return options; ! ! /* ! * If there's a service spec, use it to obtain any not-explicitly-given ! * parameters. */ ! if (parseServiceInfo(options, errorMessage)) { PQconninfoFree(options); return NULL; } - /* - * Get the fallback resources for parameters not specified in the conninfo - * string nor the service. - */ - for (option = options; option->keyword != NULL; option++) - { - if (option->val != NULL) - continue; /* Value was in conninfo or service */ - - /* - * Try to get the environment variable fallback - */ - if (option->envvar != NULL) - { - if ((tmp = getenv(option->envvar)) != NULL) - { - option->val = strdup(tmp); - if (!option->val) - { - printfPQExpBuffer(errorMessage, - libpq_gettext("out of memory\n")); - PQconninfoFree(options); - return NULL; - } - continue; - } - } - - /* - * No environment variable specified or this one isn't set - try - * compiled in - */ - if (option->compiled != NULL) - { - option->val = strdup(option->compiled); - if (!option->val) - { - printfPQExpBuffer(errorMessage, - libpq_gettext("out of memory\n")); - PQconninfoFree(options); - return NULL; - } - continue; - } - - /* - * Special handling for user - */ - if (strcmp(option->keyword, "user") == 0) - { - option->val = pg_fe_getauthname(errorMessage); - continue; - } - } - return options; } --- 4187,4200 ---- free(buf); /* ! * Fill in defaults if the caller wants that. */ ! if (use_defaults && !conninfo_fill_defaults(options, errorMessage)) { PQconninfoFree(options); return NULL; } return options; } *************** *** 4262,4268 **** conninfo_array_parse(const char *const * keywords, const char *const * values, PQExpBuffer errorMessage, bool use_defaults, int expand_dbname) { - char *tmp; PQconninfoOption *options; PQconninfoOption *str_options = NULL; PQconninfoOption *option; --- 4217,4222 ---- *************** *** 4386,4405 **** conninfo_array_parse(const char *const * keywords, const char *const * values, PQconninfoFree(str_options); /* ! * Stop here if caller doesn't want defaults filled in. */ ! if (!use_defaults) ! return options; /* * If there's a service spec, use it to obtain any not-explicitly-given * parameters. */ if (parseServiceInfo(options, errorMessage)) ! { ! PQconninfoFree(options); ! return NULL; ! } /* * Get the fallback resources for parameters not specified in the conninfo --- 4340,4377 ---- PQconninfoFree(str_options); /* ! * Fill in defaults if the caller wants that. */ ! if (use_defaults && !conninfo_fill_defaults(options, errorMessage)) ! { ! PQconninfoFree(options); ! return NULL; ! } ! ! return options; ! } ! ! /* ! * Fills the connection options array with the default values for unspecified ! * options. ! * ! * Defaults are supplied from a service file, environment variables, etc. ! * ! * Returns TRUE if successful, FALSE otherwise, while filling in errorMessage. ! */ ! static bool ! conninfo_fill_defaults(PQconninfoOption *options, ! PQExpBuffer errorMessage) ! { ! PQconninfoOption *option; ! char *tmp; /* * If there's a service spec, use it to obtain any not-explicitly-given * parameters. */ if (parseServiceInfo(options, errorMessage)) ! return false; /* * Get the fallback resources for parameters not specified in the conninfo *************** *** 4422,4429 **** conninfo_array_parse(const char *const * keywords, const char *const * values, { printfPQExpBuffer(errorMessage, libpq_gettext("out of memory\n")); ! PQconninfoFree(options); ! return NULL; } continue; } --- 4394,4400 ---- { printfPQExpBuffer(errorMessage, libpq_gettext("out of memory\n")); ! return false; } continue; } *************** *** 4440,4447 **** conninfo_array_parse(const char *const * keywords, const char *const * values, { printfPQExpBuffer(errorMessage, libpq_gettext("out of memory\n")); ! PQconninfoFree(options); ! return NULL; } continue; } --- 4411,4417 ---- { printfPQExpBuffer(errorMessage, libpq_gettext("out of memory\n")); ! return false; } continue; } *************** *** 4456,4462 **** conninfo_array_parse(const char *const * keywords, const char *const * values, } } ! return options; } static char * --- 4426,4432 ---- } } ! return true; } static char *