diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 7b0fb0ea9dc..c7e6c6b984e 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -455,6 +455,11 @@ pqDropConnection(PGconn *conn, bool flushInput) { OM_uint32 min_s; + if (conn->gcred != GSS_C_NO_CREDENTIAL) + { + gss_release_cred(&min_s, &conn->gcred); + conn->gcred = GSS_C_NO_CREDENTIAL; + } if (conn->gctx) gss_delete_sec_context(&min_s, &conn->gctx, GSS_C_NO_BUFFER); if (conn->gtarg_nam) @@ -474,6 +479,7 @@ pqDropConnection(PGconn *conn, bool flushInput) free(conn->gss_ResultBuffer); conn->gss_ResultBuffer = NULL; } + conn->gssenc = false; } #endif #ifdef ENABLE_SSPI @@ -1936,11 +1942,6 @@ connectDBStart(PGconn *conn) */ resetPQExpBuffer(&conn->errorMessage); -#ifdef ENABLE_GSS - if (conn->gssencmode[0] == 'd') /* "disable" */ - conn->try_gss = false; -#endif - /* * Set up to try to connect to the first host. (Setting whichhost = -1 is * a bit of a cheat, but PQconnectPoll will advance it to 0 before @@ -2380,6 +2381,9 @@ keep_going: /* We will come back to here until there is conn->allow_ssl_try = (conn->sslmode[0] != 'd'); /* "disable" */ conn->wait_ssl_try = (conn->sslmode[0] == 'a'); /* "allow" */ #endif +#ifdef ENABLE_GSS + conn->try_gss = (conn->gssencmode[0] != 'd'); /* "disable" */ +#endif reset_connection_state_machine = false; need_new_connection = true; @@ -3259,12 +3263,8 @@ keep_going: /* We will come back to here until there is */ if (conn->gssenc && conn->gssencmode[0] == 'p') { - OM_uint32 minor; - /* postmaster expects us to drop the connection */ conn->try_gss = false; - conn->gssenc = false; - gss_delete_sec_context(&minor, &conn->gctx, NULL); pqDropConnection(conn, true); conn->status = CONNECTION_NEEDED; goto keep_going; @@ -3838,9 +3838,6 @@ makeEmptyPGconn(void) conn->verbosity = PQERRORS_DEFAULT; conn->show_context = PQSHOW_CONTEXT_ERRORS; conn->sock = PGINVALID_SOCKET; -#ifdef ENABLE_GSS - conn->try_gss = true; -#endif /* * We try to send at least 8K at a time, which is the usual size of pipe @@ -3980,22 +3977,6 @@ freePGconn(PGconn *conn) free(conn->gsslib); if (conn->connip) free(conn->connip); -#ifdef ENABLE_GSS - if (conn->gcred != GSS_C_NO_CREDENTIAL) - { - OM_uint32 minor; - - gss_release_cred(&minor, &conn->gcred); - conn->gcred = GSS_C_NO_CREDENTIAL; - } - if (conn->gctx) - { - OM_uint32 minor; - - gss_delete_sec_context(&minor, &conn->gctx, GSS_C_NO_BUFFER); - conn->gctx = NULL; - } -#endif /* Note that conn->Pfdebug is not ours to close or free */ if (conn->last_query) free(conn->last_query);