]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Parse libpq's "keepalives" option more like other integer options.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Oct 2024 21:30:36 +0000 (17:30 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 2 Oct 2024 21:30:36 +0000 (17:30 -0400)
Use pqParseIntParam (nee parse_int_param) instead of using strtol
directly.  This allows trailing whitespace, which the previous coding
didn't, and makes the spelling of the error message consistent with
other similar cases.

This seems to be an oversight in commit e7a221797, which introduced
parse_int_param.  That fixed places that were using atoi(), but missed
this place which was randomly using strtol() instead.

Ordinarily I'd consider this minor cleanup not worth back-patching.
However, it seems that ecpg assumes it can add trailing whitespace
to URL parameters, so that use of the keepalives option fails in
that context.  Perhaps that's worth improving as a separate matter.
In the meantime, back-patch this to all supported branches.

Yuto Sasaki (some further cleanup by me)

Discussion: https://postgr.es/m/TY2PR01MB36286A7B97B9A15793335D18C1772@TY2PR01MB3628.jpnprd01.prod.outlook.com

src/interfaces/libpq/fe-connect.c

index 47dcb37fd49ccf457439e19d4d1a95e0a1b70de1..543df7801a943121a0a6ef68d4bcdf6341b0a3dd 100644 (file)
@@ -427,6 +427,8 @@ static void pgpassfileWarning(PGconn *conn);
 static void default_threadlock(int acquire);
 static bool sslVerifyProtocolVersion(const char *version);
 static bool sslVerifyProtocolRange(const char *min, const char *max);
+static bool parse_int_param(const char *value, int *result, PGconn *conn,
+                                                       const char *context);
 
 
 /* global variable because fe-auth.c needs to access it */
@@ -1780,14 +1782,14 @@ connectFailureMessage(PGconn *conn, int errorno)
 static int
 useKeepalives(PGconn *conn)
 {
-       char       *ep;
        int                     val;
 
        if (conn->keepalives == NULL)
                return 1;
-       val = strtol(conn->keepalives, &ep, 10);
-       if (*ep)
+
+       if (!parse_int_param(conn->keepalives, &val, conn, "keepalives"))
                return -1;
+
        return val != 0 ? 1 : 0;
 }
 
@@ -2634,8 +2636,7 @@ keep_going:                                               /* We will come back to here until there is
 
                                                if (usekeepalives < 0)
                                                {
-                                                       appendPQExpBufferStr(&conn->errorMessage,
-                                                                                                libpq_gettext("keepalives parameter must be an integer\n"));
+                                                       /* error is already reported */
                                                        err = 1;
                                                }
                                                else if (usekeepalives == 0)