pg_amcheck: Fix block number parsing on command line
authorPeter Eisentraut
Fri, 20 Aug 2021 05:48:22 +0000 (07:48 +0200)
committerPeter Eisentraut
Fri, 20 Aug 2021 08:52:23 +0000 (10:52 +0200)
The previous code wouldn't handle higher block numbers on systems
where sizeof(long) == 4.

Reviewed-by: Mark Dilger
Discussion: https://www.postgresql.org/message-id/flat/6a10a211-872b-3c4c-106b-909ae5fefa61%40enterprisedb.com

src/bin/pg_amcheck/pg_amcheck.c

index e6ea8e6e5d088b30b1a529d8a12e44484382295f..07d7dd005e7e9bbad1af8b350488a22f1e8e1322 100644 (file)
@@ -297,6 +297,7 @@ main(int argc, char *argv[])
                            long_options, &optindex)) != -1)
    {
        char       *endptr;
+       unsigned long optval;
 
        switch (c)
        {
@@ -409,30 +410,34 @@ main(int argc, char *argv[])
                }
                break;
            case 7:
-               opts.startblock = strtol(optarg, &endptr, 10);
-               if (*endptr != '\0')
+               errno = 0;
+               optval = strtoul(optarg, &endptr, 10);
+               if (endptr == optarg || *endptr != '\0' || errno != 0)
                {
                    pg_log_error("invalid start block");
                    exit(1);
                }
-               if (opts.startblock > MaxBlockNumber || opts.startblock < 0)
+               if (optval > MaxBlockNumber)
                {
                    pg_log_error("start block out of bounds");
                    exit(1);
                }
+               opts.startblock = optval;
                break;
            case 8:
-               opts.endblock = strtol(optarg, &endptr, 10);
-               if (*endptr != '\0')
+               errno = 0;
+               optval = strtoul(optarg, &endptr, 10);
+               if (endptr == optarg || *endptr != '\0' || errno != 0)
                {
                    pg_log_error("invalid end block");
                    exit(1);
                }
-               if (opts.endblock > MaxBlockNumber || opts.endblock < 0)
+               if (optval > MaxBlockNumber)
                {
                    pg_log_error("end block out of bounds");
                    exit(1);
                }
+               opts.endblock = optval;
                break;
            case 9:
                opts.rootdescend = true;