createuser: fix parsing of --connection-limit argument
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 10 Feb 2020 15:14:58 +0000 (12:14 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 10 Feb 2020 15:14:58 +0000 (12:14 -0300)
The original coding failed to quote the argument properly.

Reported-by: Daniel Gustafsson
Discussion: 1B8AE66C-85AB-4728-9BB4-612E8E61C219@yesql.se

src/bin/scripts/createuser.c

index 45b6a7c32a5bb1823b504faba3265be64d95f295..e781ecab2fb6d5e0477537fb42a9015de48d5f59 100644 (file)
@@ -60,7 +60,7 @@ main(int argc, char *argv[])
        enum trivalue prompt_password = TRI_DEFAULT;
        bool            echo = false;
        bool            interactive = false;
-       char       *conn_limit = NULL;
+       int                     conn_limit = -2;        /* less than minimum valid value */
        bool            pwprompt = false;
        char       *newpassword = NULL;
        char            newuser_buf[128];
@@ -88,6 +88,8 @@ main(int argc, char *argv[])
        while ((c = getopt_long(argc, argv, "h:p:U:g:wWedDsSrRiIlLc:PE",
                                                        long_options, &optindex)) != -1)
        {
+               char   *endptr;
+
                switch (c)
                {
                        case 'h':
@@ -142,7 +144,14 @@ main(int argc, char *argv[])
                                login = TRI_NO;
                                break;
                        case 'c':
-                               conn_limit = pg_strdup(optarg);
+                               conn_limit = strtol(optarg, &endptr, 10);
+                               if (*endptr != '\0' || conn_limit < -1) /* minimum valid value */
+                               {
+                                       fprintf(stderr,
+                                                       _("%s: invalid value for --connection-limit: %s\n"),
+                                                       progname, optarg);
+                                       exit(1);
+                               }
                                break;
                        case 'P':
                                pwprompt = true;
@@ -297,8 +306,8 @@ main(int argc, char *argv[])
                appendPQExpBufferStr(&sql, " REPLICATION");
        if (replication == TRI_NO)
                appendPQExpBufferStr(&sql, " NOREPLICATION");
-       if (conn_limit != NULL)
-               appendPQExpBuffer(&sql, " CONNECTION LIMIT %s", conn_limit);
+       if (conn_limit >= -1)
+               appendPQExpBuffer(&sql, " CONNECTION LIMIT %d", conn_limit);
        if (roles.head != NULL)
        {
                SimpleStringListCell *cell;