]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
libpq-oauth: Print libcurl version with OAUTHDEBUG_UNSAFE_TRACE
authorJacob Champion <jchampion@postgresql.org>
Wed, 17 Jun 2026 16:57:20 +0000 (09:57 -0700)
committerJacob Champion <jchampion@postgresql.org>
Wed, 17 Jun 2026 16:57:20 +0000 (09:57 -0700)
When debugging an OAuth trace, it's helpful to know what version of Curl
is in use. The SSL library that Curl is using (which may not be the one
in use by libpq) is also relevant, and it's just as easy to get, so
print that too.

This is being added post-feature-freeze, with RMT approval, in order to
fix some tests in the face of an upstream Curl regression. A subsequent
commit will make use of it in oauth_validator. Backpatch to 18 as well.

Tested-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAOYmi%2B%3DkP86t%2BZFFXNQ9G6K4ht7utdmB%3DCzhP%3DZ2wvuBymOTtQ%40mail.gmail.com
Backpatch-through: 18

src/interfaces/libpq-oauth/oauth-curl.c

index 7ba75fc6d047b10e1e48a47c2f11e2ec0bd68397..d4dcc4cd7a53af2e7a3db047c3513e0431c509eb 100644 (file)
@@ -2687,7 +2687,7 @@ prompt_user(struct async_ctx *actx, PGconn *conn)
  * function will not try to reinitialize Curl on successive calls.
  */
 static bool
-initialize_curl(PGoauthBearerRequestV2 *req)
+initialize_curl(PGoauthBearerRequestV2 *req, uint32 debug_flags)
 {
        /*
         * Don't let the compiler play tricks with this variable. In the
@@ -2696,9 +2696,7 @@ initialize_curl(PGoauthBearerRequestV2 *req)
         * PG_BOOL_YES/NO in cases where that's not the final answer.
         */
        static volatile PGTernaryBool init_successful = PG_BOOL_UNKNOWN;
-#if HAVE_THREADSAFE_CURL_GLOBAL_INIT
        curl_version_info_data *info;
-#endif
 
 #if !HAVE_THREADSAFE_CURL_GLOBAL_INIT
 
@@ -2744,6 +2742,8 @@ initialize_curl(PGoauthBearerRequestV2 *req)
                goto done;
        }
 
+       info = curl_version_info(CURLVERSION_NOW);
+
 #if HAVE_THREADSAFE_CURL_GLOBAL_INIT
 
        /*
@@ -2753,7 +2753,6 @@ initialize_curl(PGoauthBearerRequestV2 *req)
         * situation), then double-check to make sure the runtime setting agrees,
         * to try to catch silent downgrades.
         */
-       info = curl_version_info(CURLVERSION_NOW);
        if (!(info->features & CURL_VERSION_THREADSAFE))
        {
                /*
@@ -2770,6 +2769,22 @@ initialize_curl(PGoauthBearerRequestV2 *req)
        }
 #endif
 
+       if (debug_flags & OAUTHDEBUG_UNSAFE_TRACE)
+       {
+               /*
+                * Record the version of libcurl and its SSL library when tracing,
+                * since those are likely to be relevant to network debugging. Neither
+                * of these strings should be NULL in a useful installation, but
+                * that's no reason to crash if they are, so provide fallbacks.
+                *
+                * Other Curl dependency info might be helpful in the future, too;
+                * just be sure to check info->age as needed when adding more.
+                */
+               fprintf(stderr, "[libpq] initialized libcurl %s (%s)\n",
+                               info->version ? info->version : "version unknown",
+                               info->ssl_version ? info->ssl_version : "no SSL");
+       }
+
        init_successful = PG_BOOL_YES;
 
 done:
@@ -3064,8 +3079,12 @@ pg_start_oauthbearer(PGconn *conn, PGoauthBearerRequestV2 *request)
 {
        struct async_ctx *actx;
        PQconninfoOption *conninfo = NULL;
+       uint32          debug_flags;
 
-       if (!initialize_curl(request))
+       /* Parse debug flags from the environment. */
+       debug_flags = oauth_parse_debug_flags();
+
+       if (!initialize_curl(request, debug_flags))
                return -1;
 
        /*
@@ -3093,9 +3112,7 @@ pg_start_oauthbearer(PGconn *conn, PGoauthBearerRequestV2 *request)
         * Now finish filling in the actx.
         */
 
-       /* Parse debug flags from the environment. */
-       actx->debug_flags = oauth_parse_debug_flags();
-
+       actx->debug_flags = debug_flags;
        initPQExpBuffer(&actx->work_data);
        initPQExpBuffer(&actx->errbuf);