]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Use extensible buffers to assemble command lines
authorPeter Eisentraut <peter@eisentraut.org>
Sun, 11 Feb 2024 08:08:35 +0000 (09:08 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Sun, 11 Feb 2024 08:27:48 +0000 (09:27 +0100)
This makes use of StringInfo to assemble command lines, instead of
using fixed-size buffers and the (remote) possibility of "command too
long" errors.  Also makes the code a bit simpler.

This covers the test driver programs pg_regress and
pg_isolation_regress.

Similar to the changes done for pg_rewind in a33e17f210.

Discussion: https://www.postgresql.org/message-id/2be4fee5-738f-4749-b9f8-b452032c7ade%40eisentraut.org

src/test/isolation/isolation_main.c
src/test/regress/pg_regress_main.c

index 05e81035c1fec526dc54e3473300555bb3f94868..2a3e41d2101e7a3e8e6076a760b16a3d1b401191 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "postgres_fe.h"
 
+#include "lib/stringinfo.h"
 #include "pg_regress.h"
 
 char           saved_argv0[MAXPGPATH];
@@ -34,8 +35,7 @@ isolation_start_test(const char *testname,
        char            infile[MAXPGPATH];
        char            outfile[MAXPGPATH];
        char            expectfile[MAXPGPATH];
-       char            psql_cmd[MAXPGPATH * 3];
-       size_t          offset = 0;
+       StringInfoData psql_cmd;
        char       *appnameenv;
 
        /* need to do the path lookup here, check isolation_init() for details */
@@ -75,34 +75,23 @@ isolation_start_test(const char *testname,
        add_stringlist_item(resultfiles, outfile);
        add_stringlist_item(expectfiles, expectfile);
 
+       initStringInfo(&psql_cmd);
+
        if (launcher)
-       {
-               offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
-                                                  "%s ", launcher);
-               if (offset >= sizeof(psql_cmd))
-               {
-                       fprintf(stderr, _("command too long\n"));
-                       exit(2);
-               }
-       }
+               appendStringInfo(&psql_cmd, "%s ", launcher);
 
-       offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
-                                          "\"%s\" \"dbname=%s\" < \"%s\" > \"%s\" 2>&1",
-                                          isolation_exec,
-                                          dblist->str,
-                                          infile,
-                                          outfile);
-       if (offset >= sizeof(psql_cmd))
-       {
-               fprintf(stderr, _("command too long\n"));
-               exit(2);
-       }
+       appendStringInfo(&psql_cmd,
+                                        "\"%s\" \"dbname=%s\" < \"%s\" > \"%s\" 2>&1",
+                                        isolation_exec,
+                                        dblist->str,
+                                        infile,
+                                        outfile);
 
        appnameenv = psprintf("isolation/%s", testname);
        setenv("PGAPPNAME", appnameenv, 1);
        free(appnameenv);
 
-       pid = spawn_process(psql_cmd);
+       pid = spawn_process(psql_cmd.data);
 
        if (pid == INVALID_PID)
        {
@@ -113,6 +102,8 @@ isolation_start_test(const char *testname,
 
        unsetenv("PGAPPNAME");
 
+       pfree(psql_cmd.data);
+
        return pid;
 }
 
index 18155ef97e28f00f955e3948512f692205414722..d607a3023b24133cb0204e34404d08931fd9ae46 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "postgres_fe.h"
 
+#include "lib/stringinfo.h"
 #include "pg_regress.h"
 
 /*
@@ -34,8 +35,7 @@ psql_start_test(const char *testname,
        char            infile[MAXPGPATH];
        char            outfile[MAXPGPATH];
        char            expectfile[MAXPGPATH];
-       char            psql_cmd[MAXPGPATH * 3];
-       size_t          offset = 0;
+       StringInfoData psql_cmd;
        char       *appnameenv;
 
        /*
@@ -62,40 +62,29 @@ psql_start_test(const char *testname,
        add_stringlist_item(resultfiles, outfile);
        add_stringlist_item(expectfiles, expectfile);
 
+       initStringInfo(&psql_cmd);
+
        if (launcher)
-       {
-               offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
-                                                  "%s ", launcher);
-               if (offset >= sizeof(psql_cmd))
-               {
-                       fprintf(stderr, _("command too long\n"));
-                       exit(2);
-               }
-       }
+               appendStringInfo(&psql_cmd, "%s ", launcher);
 
        /*
         * Use HIDE_TABLEAM to hide different AMs to allow to use regression tests
         * against different AMs without unnecessary differences.
         */
-       offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
-                                          "\"%s%spsql\" -X -a -q -d \"%s\" %s < \"%s\" > \"%s\" 2>&1",
-                                          bindir ? bindir : "",
-                                          bindir ? "/" : "",
-                                          dblist->str,
-                                          "-v HIDE_TABLEAM=on -v HIDE_TOAST_COMPRESSION=on",
-                                          infile,
-                                          outfile);
-       if (offset >= sizeof(psql_cmd))
-       {
-               fprintf(stderr, _("command too long\n"));
-               exit(2);
-       }
+       appendStringInfo(&psql_cmd,
+                                        "\"%s%spsql\" -X -a -q -d \"%s\" %s < \"%s\" > \"%s\" 2>&1",
+                                        bindir ? bindir : "",
+                                        bindir ? "/" : "",
+                                        dblist->str,
+                                        "-v HIDE_TABLEAM=on -v HIDE_TOAST_COMPRESSION=on",
+                                        infile,
+                                        outfile);
 
        appnameenv = psprintf("pg_regress/%s", testname);
        setenv("PGAPPNAME", appnameenv, 1);
        free(appnameenv);
 
-       pid = spawn_process(psql_cmd);
+       pid = spawn_process(psql_cmd.data);
 
        if (pid == INVALID_PID)
        {
@@ -106,6 +95,8 @@ psql_start_test(const char *testname,
 
        unsetenv("PGAPPNAME");
 
+       pfree(psql_cmd.data);
+
        return pid;
 }